2012-07-28 43 views
1

我有一个有n个记录的表如何从表中检索最后2条记录?

如何从我的表中获取第n条记录和第(n-1)条记录而不使用派生表?

我一直在使用ROWID作为

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

这是给第n个记录,但我想要的(N-1)个记录也试过。 而且是有比使用max,derived table and pseudo columns

由于

其他任何其他方法

回答

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 
+0

我知道使用派生表,它可以很容易地完成,所以我已经指定在不使用派生表概念的问题! 无论如何感谢ans – Aspirant 2012-07-28 19:14:46

+0

使用派生表有什么问题:请参阅asktom上的经典答案:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO: :P11_QUESTION_ID:127412348064 – davek 2012-07-28 19:15:27

+0

派生表没有错! 我只想知道是否有任何其他的解决方案相同,而不是使用派生表 – Aspirant 2012-07-28 19:23:33

1

尝试此

select top 2 * from table order by rowid desc 
+0

“TOP”适用于SQL Server,但不适用于Oracle – davek 2012-07-28 19:09:28

+0

不知道....这是一个Rank()函数可以提供帮助的地方吗? – Matt 2012-07-28 19:12:34

+0

是的,我已经通过'顶部',但它不适用于ORACLE! 在ORACLE中做同样的任何解决方案将感谢 – Aspirant 2012-07-28 19:15:56

0

假设rowid如你的表中的列:

SELECT * FROM table ORDER BY rowid DESC LIMIT 2 
+0

限制不起作用在oracle 10g – Aspirant 2012-07-28 19:25:29

+0

啊,出于某种原因,我想你的问题是具体到MYSQL – 2012-07-28 20:52:26

3

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

可以使用,例如:

select * 
from (select t.*, row_number() over (order by <id> desc) as seqnum 
     from t 
    ) t 
where seqnum <= 2 

虽然允许在语法,通过子句中的子查询的顺序被忽略(例如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)。确实,在一个空的数据库中,将记录插入到新表中可能会创建一个单调递增的行标识序列。 但你不能依赖这个。使用rowid的唯一保证是它们在表中是唯一的,并且是访问特定行的最快方式。

我不得不承认,我无法找到有关Oracle处理的良好文档,也没有在其最新版本的子查询中处理顺序。 ANSI SQL不要求兼容数据库通过子查询支持顺序。 Oracle语法允许它,至少在某些情况下它似乎有效。我最好的猜测是,它可能适用于单处理器,Oracle的单线程实例,或者数据访问是通过索引进行的。一旦引入并行性,结果可能不会被排序。自从我开始使用Oracle(在20世纪90年代中期)以来,我一直认为子查询中的次序通常被忽略。我的建议是不依赖于功能,直到甲骨文明确表示它被支持。

+0

whyso? rowid在表中是唯一的。请参阅此处的评论:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:127412348064#345039100346541491 – davek 2012-07-28 19:31:39

+1

@davek。 。 。 Rowid是确定性的,但它不一定以任何特定顺序分配。它提供获取行的访问路径,而不是表中行的排序。 – 2012-07-28 19:38:00

+0

感谢您的帮助解释:这可能解释了为什么Tonm Kyte建议*将rowid添加到任何顺序以确保它没有遇到任何分组。 – davek 2012-07-28 19:41:30

相关问题