2012-07-28 86 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

相關問題