首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从表中检索最后2条记录?

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

Stack Overflow用户
提问于 2012-07-29 03:06:40
回答 4查看 9.6K关注 0票数 1

我有一个包含n条记录的表

如何在不使用派生表的情况下从我的SQL表中检索第n条记录和第(n-1)条记录?

我曾尝试使用ROWID作为

代码语言:javascript
复制
select * from table where rowid in (select max(rowid) from table);

它给出了第n条记录,但我也想要第(n-1)条记录。除了使用max,derived table and pseudo columns之外,还有其他方法吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-29 03:10:13

代码语言:javascript
复制
select * from (select * from my_table order by rowid) where rownum <= 2

对于N和M之间的行:

代码语言:javascript
复制
select * from (
   select * from (
      select * from my_table order by rowid
                 ) where rownum <= M
              ) where rownum >= N
票数 2
EN

Stack Overflow用户

发布于 2012-07-29 03:23:38

您不能依赖rowid将您带到表中的最后一行。您需要一个自动递增的id或创建时间来获得正确的排序。

您可以使用,例如:

代码语言:javascript
复制
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明确声明支持该功能之前,不要依赖于该功能。

票数 3
EN

Stack Overflow用户

发布于 2012-07-29 03:08:10

尝尝这个

代码语言:javascript
复制
select top 2 * from table order by rowid desc
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11703844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档