如何从表中检索最后2条记录?

时间:2012-07-28 19:06:40

标签: sql oracle10g

我有一张包含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

之外还有其他方法吗?

由于

4 个答案:

答案 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