oracle中rownum偽字段用得比較頻繁,特別是分頁之中,但是由於它的一些特殊性很多人可能並不理解它的實際行為,網路上有很多文章介紹這個 rownum的用法,但是很多都講得非常模糊,或者就是不太全面,大家看起來也非常痛苦,在這裡我將給大家全面講解一下,希望對大家有所幫助:
首先我們來認識幾點rownum的特殊性:
第一、rownum是在記錄輸出的時候才一步一步的產生的。
第二、如果之前沒有滿足條件的記錄輸出,則後面的rownum始終都是從1開始的。
記住以上兩點,基本上你也算是非常了解這個偽字段的用法了,下面我來具體分析一下這些特殊性。我們考察如下的 sql語句:
select * from test where rownum >=1; select * from test where rownum >=2; select * from test where rownum <= 10;
假設test表有15條記錄,這裡第一條sql輸出15條記錄,第2條sql輸出0條,第3條sql輸出10條記錄。
為什麼呢?上面我說過了,由於它的特殊性,rownum是在記錄輸出的時候才產生,所以我們按照下面的步驟來
處理:
1)任何在同一條sql上出現的rownum我們都可以先忽略掉,然後這三條sql語句都只有
select * from test
2) 我們此時輸出記錄,當輸出第一條記錄時,此時oracle會安排他的rownum=1,前面也說過了
(如果之前沒有滿足條件的記錄輸出,則後面的rownum始終都是從1開始的)
3)這個時候加上rownum的where條件來篩選這條記錄是否滿足,我們發現,只有第一條sql和第3條sql滿足rownum>=1和rownum<=10,而第2條sql rownum>=2,明顯該記錄不滿足條件,因為輸出的第一條記錄rownum=1.
4)輸出第2條記錄,此時第1條sql和第3條sql由於前面都有一條滿足條件的記錄了,此時rownum會安排成2,
明顯第2條記錄也滿足需求。我們再來看第2條sql語句,我們此時輸出第2條記錄,但是由於之前輸出的一條記
錄被它否決了,即不滿足條件,這時的輸出的第2條記錄rownum仍然等於1,注意了哦,很多人不明白為什麼,其
實很簡單,如果之前沒有滿足條件的記錄輸出,則後面的rownum始終都是從1開始的,只有前面輸出了一條滿足條件的記錄之後,後面的記錄rownum才會增加。--簡單吧,所以這裡對於第2條sql來講,他的這個記錄rownum還是等於1,又不滿足條件。
5)記錄處理其他記錄。
按照上面的的方法你就可以處理任何關於rownum的sql了,比如:
select * from test where rownum >=1 and id>5 order by id asc;
按照上面的方法,首先去掉rownum和排序的order by然後剩下 select * from test where id>5; 這裡弄完了會
輸出結果,然後迴圈的處理每一條記錄,有滿足條件的rownum就增加,沒有滿足條件的記錄就不增加。然後對結果進行排序。就這麼
簡單。為什麼要去掉order by?因為排序是結果出來之後才能排序,而結果出來的時候rownum就已經分配了。所以,如果上面這條語句最後列印出來的rownum是拍過序的。
還有一點要注意,這個rownum的處理過程是針對同一層sql而言,也就是select 和rownum處於同乙個層次才
能這麼做。如果是巢狀sql,特殊情況特殊分析。
例如:
select * from( select * from test where id>5 and rownum
<=6) t where rownum >=1 order by t.id asc
上面顏色相同的處於同乙個層次。
oracle rownum終極講解
oracle中rownum偽字段用得比較頻繁,特別是分頁之中,但是由於它的一些特殊性很多人可能並不理解它的實際行為,網路上有很多文章介紹這個 rownum的用法,但是很多都講得非常模糊,或者就是不太全面,大家看起來也非常痛苦,在這裡我將給大家全面講解一下,希望對大家有所幫助 首先我們來認識幾點row...
oracle rownum使用小記
對於 oracle 的 rownum 問題,很多資料都說不支援 between.and,只能用以上符號 並非說用 gt between.and 時會提示sql語法錯誤,而是經常是查不出一條記錄來,還會出現似乎是莫名其妙的結果來,其實您只要理解好了這個 rownum 偽列的意義就不應該感到驚奇,同樣是...
Oracle Rownum 偽列詳解
rowid與rownum雖都被稱為偽列,但它們的存在方式是不一樣的,rowid可以說是物理存在的,表示記錄在表空間中的唯一位置id,在db中唯一。只要記錄沒被搬動過,rowid是不變的。rowid相對於表來說又像表中的一般列,所以以rowid為條件就不會有rownum那些情況發生。rownum不能以...