1

I have a table with n number of records

How can i retrieve the nth record and (n-1)th record from my table in SQL without using derived table ?

I have tried using ROWID as

select * from table where rowid in (select max(rowid) from table);

It is giving the nth record but i want the (n-1)th record also . And is there any other method other than using max,derived table and pseudo columns

Thanks

4

4 回答 4

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 处理或不处理 order by 的良好文档。ANSI SQL 不需要兼容的数据库来支持子查询中的排序。Oracle 语法允许这样做,并且至少在某些情况下似乎可以工作。我最好的猜测是,它可能会在单个处理器、Oracle 的单线程实例上运行,或者如果数据访问是通过索引进行的。一旦引入并行性,结果可能不会被排序。自从我开始使用 Oracle(在 1990 年代中期)以来,我一直认为子查询中的 order bys 通常会被忽略。我的建议是不要依赖于功能,直到 Oracle 明确声明它受支持。

于 2012-07-28T19:23:38.367 回答
2
select * from (select * from my_table order by rowid) where rownum <= 2

and for rows between N and M:

select * from (
   select * from (
      select * from my_table order by rowid
                 ) where rownum <= M
              ) where rownum >= N
于 2012-07-28T19:10:13.450 回答
1

Try this

select top 2 * from table order by rowid desc
于 2012-07-28T19:08:09.823 回答
0

假设rowid作为表中的列:

SELECT * FROM table ORDER BY rowid DESC LIMIT 2
于 2012-07-28T19:20:03.667 回答