我有一张包含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
由于
答案 0 :(得分:3)
你不能依赖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)。
为了清楚起见,rowid与表中行的排序无关。 Oracle文档非常清楚,它们为数据指定了物理访问路径(http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i6732) 。确实,在空数据库中,将记录插入到新表中可能会创建一个单调递增的行ID序列。 但你不能依赖于此。对rowid的唯一保证是它们在表中是唯一的,并且是访问特定行的最快方式。
我必须承认,在最新版本的子查询中,我无法找到有关Oracle处理或不处理顺序的良好文档。 ANSI SQL不要求兼容的数据库支持子查询中的顺序。 Oracle语法允许它,并且它似乎在某些情况下起作用,至少。我最好的猜测是,它可能适用于单个处理器,Oracle的单线程实例,或者数据访问是通过索引进行的。一旦引入并行性,结果可能不会被排序。自从我开始使用Oracle(在20世纪90年代中期)以来,我一直认为子查询中的顺序通常会被忽略。我的建议是不依赖于功能,直到Oracle明确表示它受支持。
答案 1 :(得分:2)
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
答案 2 :(得分:1)
试试这个
select top 2 * from table order by rowid desc
答案 3 :(得分:0)
假设rowid
为表中的列:
SELECT * FROM table ORDER BY rowid DESC LIMIT 2