Oracle實現分頁的注意點

select a.*, rownum r
  from (select * from lg_order o order by o.order_id) a
 where rownum <= 20
   and rownum >= 10


這句是錯誤的 由於rownum是一個總是從1開始的僞列,Oracle 認爲這種條件不成立,查不到記錄

 

select a.*
          from (select *,
rownum r from lg_order o where rownum <= 20 ) a
 where a.r >= 10

對於沒有排序操作的分頁,這樣寫是對的。

 

select a.*
          from (select *,
rownum r

                      from lg_order o where rownum <= 20   order by o.order_id ) a
 where a.r >= 10

對於有排序操作的,這樣寫就錯了,這個時候rownum 就不是你想像的了
對於sql語句 from 先執行
然後是 where
然後是select
最後是 order
在你where的時候 還沒有order
這個時候rownum 是原始的rownum 不是排好順序的rownum


所以有排序操作的應該這樣寫:

select *
  from (select a.*, rownum r
          from (select * from lg_order o order by o.order_id) a
         where rownum <= 20) b
 where b.r >= 10


<script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

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