Oracle的分頁是通過rownum實現的
rownum是一個偽列是oracle系統自動為查詢返回結果的每行分配的編號第一行為第二行為以此類推
一個oracle分頁至少要包含三層(除非不用order by暫時可以用層實現)模板為
select temp* from(
select rownum numtemp* from(
SQL查詢
) temp where rownum<=n
)temp where tempnum>n
例如值返回查詢結果第條到條著條的信息的SQL如下
select temp*
from(
select rownum numtemp*
from(
select tttitle_idttname
from t_title tt
where ttname like %美%
order by ttsort_seqs asctttitle_Id desc) temp
where rownum<=
)temp
where tempnum>
分析
首先是一個正常的查詢語句(包含order by)
select tttitle_idttname
from t_title tt
where ttname like %美%
order by ttsort_seqs asctttitle_Id desc
這個和正常的SQL語句沒有任何的區別
添加rownum字段顯示列數
select rownum numtemp*
from(
select tttitle_idttname
from t_title tt
where ttname like %美%
order by ttsort_seqs asctttitle_Id desc) temp
where rownum<=
我們添加了rownum 顯示字段這時候就會會每行添加一個行數的編號並且只返回條之前的數據(包含條)
截取第條到條的數據SQL就是上面最完整的那個啦
使用精解
rownum的使用
如下兩條語句
select rownumidname from student where rownum>;
select rownumidname from student where rownum<=;
第一條語句的執行結果為空第二條語句的執行結果為前條記錄
為什麼會這樣呢我們知道rownum是偽列是oracle為查詢結果自動添加的偽列第一行是如果where rownum>這時候查找第一條發現它的rownum=不滿足條件於是拋棄掉把第二條語句的rownum賦值為再判斷第二條記錄是否滿足條件同樣不滿足於是發生了死循環一樣的判斷最終返回空
有人這時候就奇怪啦為什麼第一條記錄rownum=不滿足條件時候第二條記錄rownum=卻要重新設值為呢非常簡單你直接在where後添加了條件rownum>它是個條件啦第一條記錄不滿足條件叫拋棄掉啦這時候結果集是空的當然會一直rownum=的賦值
解決辦法:先查詢並為每條記錄分配rownum然後嵌套查詢
select t* from (select rownum numidname from student) t where tnum>
第二條語句可以正常的執行根據上面的解釋這個可以理解了吧!
rownum與order by同時存在的問題
當 where 後面有rownum的判斷並且存在order by時候rownum的優先級高!
oracle會先執行rownum的判斷然後從結果中order by很明顯是錯誤的結果啦!就好像學校要取成績最好的前名同學結果這種方法一執行成了取出名同學然後按照成績的高低排序!
這點與SQL Server的TOP完全不同TOP遇上order by是先執行order by在分頁的
解決辦法就是先執行order by然後嵌套執行rownum說白啦就是用()改變函數的優先級!
From:http://tw.wingwit.com/Article/program/Oracle/201311/17827.html