Oracle的rownum和分析函式

2021-06-16 07:09:03 字數 1394 閱讀 5265

racle的rownum欄位是個比較奇怪的字段。拿一張有26條記錄的test表來舉例。

select * from test where rownum >=1;

select * from test where rownum >=2;

select * from test where rownum <= 10;

第一條sql查出了26條記錄,第二條sql一條記錄也沒查出。第三條sql查出10條記錄。

導致這個的原因是因為rownum是個虛擬的字段,它是在記錄輸出的時候逐步產生的

對第一條sql,第一條記錄的rownum是1,滿足條件被輸出,因此第二條紀錄的rownum就變成2,滿足條件被輸出,依此類推,就把所有紀錄都查出來了。

對於第二條sql,第一條記錄的rownum是1,不滿足條件沒被輸出,因此第二條記錄的rownum還是1,沒滿足條件沒被輸出,依此類推,所有紀錄都沒能被查出來。

對於第三條sql,第一條記錄的rownum是1,滿足條件被輸出,因此第二條記錄的rownum就遞增為2,滿足條件被輸出,直到第11條及之後的所有記錄的rownum變成了11,不滿足條件沒被輸出。

所以要查詢test表第n條到第m條的記錄,我們應該這樣寫:

//對已形成的rownum進行過濾

select * from ( 

//先用乙個select把待查sql包圍起來,此時rownum已經形成

select row_.*, rownum rownum_ from ( select * from test ) row_ 

) where rownum_ <= m and rownum_ >= n;

分析函式在9i下面是無法走stop key的執行計畫的,只有在10g的時候才行 

在9i下面的oracle分頁查詢應該如下: 

select * from ( 

select t.*,rownum rownum_ from ( 

select a.* from t a order by a.order_column 

) t where rownum < page_end 

) t where t.rownum_ > page_start 

在這樣的sql語句中,oracle會走stop key的執行計畫,也就是說,如果你要查詢10到20的記錄,那麼oracle需要讀取1到20的所有記錄,但是20之後的記錄不需要讀取。

回答樓上的,如果你要讀取一百萬和一百萬零一千條,那麼oracle需要讀取前一百萬零一千條的所有記錄。所以,這樣的分頁sql適用於主要讀取前面的一些頁面的應用,如果每一頁的讀取概率相同的話,那建議用另外一種分頁方法。如果有排序要求,將排序要求的字段建立索引,通過索引完成排序和分頁,並且取得你所需要的那一頁的rowid偽列,然後再通過rowid來讀取那一頁的記錄,具體sql就不再寫出來了。

oracle中rownum和rowid的區別

rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配乙個邏輯編號,所以你的sql不同也就會導致最終rownum不同,但是rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有乙個唯一的物理記錄 例如 aaamgzaaeaaaaagaa...

oracle中 rowid 和rownum的使用

1 利用rowid 進行 查詢重複 select e.rowid,e.from test idx e select e.rowid,e.from test idx e where e.rowid select min x.rowid from test idx x where x.col2 e.co...

oracle的rownum原理和使用

對於oracle的rownum問題,很多資料都說不支援 between and,只能用以上符號 lt 並非說用 between and 時會提示sql語法錯誤,而是經常是查不出一條記錄來,還會出現似乎是莫名其妙的結果來,其實您只要理解好了這個rownum偽列的意義就不應該感到驚 奇,同樣是偽列,ro...