有關oracle分頁的rownum字段

Oracle的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;

 

出處:http://katelin.javaeye.com/blog/197531

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章