我有一个包含n条记录的表
如何在不使用派生表的情况下从我的SQL表中检索第n条记录和第(n-1)条记录?
我曾尝试使用ROWID作为
select * from table where rowid in (select max(rowid) from table);它给出了第n条记录,但我也想要第(n-1)条记录。除了使用max,derived table and pseudo columns之外,还有其他方法吗?
谢谢
发布于 2012-07-29 03:10:13
select * from (select * from my_table order by rowid) where rownum <= 2对于N和M之间的行:
select * from (
select * from (
select * from my_table order by rowid
) where rownum <= M
) where rownum >= N发布于 2012-07-29 03:23:38
您不能依赖rowid将您带到表中的最后一行。您需要一个自动递增的id或创建时间来获得正确的排序。
您可以使用,例如:
select *
from (select t.*, row_number() over (order by <id> desc) as seqnum
from t
) t
where seqnum <= 2尽管在语法中允许,但子查询中的order by子句将被忽略(例如http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html)。
为了清楚起见,rows与表中行的顺序无关。Oracle文档非常清楚地指出,它们为数据指定了物理访问路径(http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i6732)。确实,在空数据库中,将记录插入到新表中可能会创建单调递增的行ids序列。但你不能依赖这一点。rowids的唯一保证是它们在表中是唯一的,并且是访问特定行的最快方式。
我必须承认,我找不到关于Oracle在其最新版本的子查询中处理或不处理order by的好文档。ANSI SQL不要求兼容的数据库支持子查询中的order by。Oracle语法允许这样做,而且看起来至少在某些情况下是有效的。我最好的猜测是,它可能会在单处理器、单线程的Oracle实例上工作,或者如果数据访问是通过索引进行的。一旦引入了并行性,结果可能就不会被排序。自从我开始使用Oracle (在20世纪90年代中期)以来,我一直认为子查询中的order by通常被忽略。我的建议是,在Oracle明确声明支持该功能之前,不要依赖于该功能。
发布于 2012-07-29 03:08:10
尝尝这个
select top 2 * from table order by rowid deschttps://stackoverflow.com/questions/11703844
复制相似问题