我有一個有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