我有一个有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
由于
其他任何其他方法我有一个有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
由于
其他任何其他方法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
假设rowid
如你的表中的列:
SELECT * FROM table ORDER BY rowid DESC LIMIT 2
限制不起作用在oracle 10g – Aspirant 2012-07-28 19:25:29
啊,出于某种原因,我想你的问题是具体到MYSQL – 2012-07-28 20:52:26
您不能依赖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年代中期)以来,我一直认为子查询中的次序通常被忽略。我的建议是不依赖于功能,直到甲骨文明确表示它被支持。
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
@davek。 。 。 Rowid是确定性的,但它不一定以任何特定顺序分配。它提供获取行的访问路径,而不是表中行的排序。 – 2012-07-28 19:38:00
感谢您的帮助解释:这可能解释了为什么Tonm Kyte建议*将rowid添加到任何顺序以确保它没有遇到任何分组。 – davek 2012-07-28 19:41:30
我知道使用派生表,它可以很容易地完成,所以我已经指定在不使用派生表概念的问题! 无论如何感谢ans – Aspirant 2012-07-28 19:14:46
使用派生表有什么问题:请参阅asktom上的经典答案:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO: :P11_QUESTION_ID:127412348064 – davek 2012-07-28 19:15:27
派生表没有错! 我只想知道是否有任何其他的解决方案相同,而不是使用派生表 – Aspirant 2012-07-28 19:23:33