Oracle 通過rownum實現分頁

來源:互聯網
上載者:User

//rownum是一個偽列,是Oracle系統自動為查詢返回結果的每行分配的編號,第一行為1,第二行為2,以此類推。。。。  
//一個oracle分頁,至少要包含三層(除非不用order by,暫時可以用2層實現),模板為  
select temp2.* from(  
       select rownum num,temp1.* from(  
              SQL query  
       ) temp1 where rownum<=n1  
)temp2 where temp2.num>n2  
-  
//例如:值返回查詢結果第11條到20條著10條的資訊的SQL如下:  
select temp2.*  
from(  
    select rownum num,temp1.*  
      from(  
        select tt.title_id,tt.name  
              from t_title tt  
        where tt.name like '%美%' 
        order by tt.sort_seqs asc,tt.title_Id desc) temp1  
    where rownum<=20  
)temp2   
where temp2.num>10  
//分析:  
//1.首先是一個正常的查詢語句(包含order by)  
select tt.title_id,tt.name  
from t_title tt  
where tt.name like '%美%' 
order by tt.sort_seqs asc,tt.title_Id desc  
//這個和正常的SQL語句沒有任何的區別  
--  
//2.添加rownum欄位,顯示列數(注意:rownum一定是先<n1,嵌套後再>n2)  
select rownum num,temp1.*  
from(  
    select tt.title_id,tt.name  
    from t_title tt  
    where tt.name like '%美%' 
    order by tt.sort_seqs asc,tt.title_Id desc) temp1  
where rownum<=20  
//我們添加了rownum 顯示欄位,這時候就會會每行添加一個行數的編號;並且只返回20條之前的資料(包含20條)  
--  
//3.截取第10條到20條的資料,SQL就是上面最完整的那個啦。  
//使用精解:  
//1.rownum的使用:  
//如下兩條語句:  
select rownum,id,name from student where rownum>2;  
select rownum,id,name from student where rownum<=10;  
--  
//第一條語句的執行結果為空白,第二條語句的執行結果為前10條記錄;  
//為什麼會這樣呢,我們知道rownum是偽列,是oracle為查詢結果自動添加的偽列,第一行是1,  
//如果where rownum>2,這時候尋找第一條發現它的rownum=1,不滿足條件,於是拋棄掉,  
//把第二條語句的rownum賦值為1,再判斷第二條記錄是否滿足條件,同樣不滿足。。。。  
//於是發生了死迴圈一樣的判斷,最終返回空;  
//有人這時候就奇怪啦,為什麼第一條記錄rownum=1不滿足條件時候,第二條記錄rownum=2,卻要重新設值為1呢?  
//非常簡單,你直接在where後添加了條件rownum>2,它是個條件啦,  
//第一條記錄不滿足條件,叫拋棄掉啦,這時候結果集是空的,當然會一直rownum=1的賦值;  
//解決辦法:先查詢,並為每條記錄分配rownum,然後巢狀查詢  
select t.* from (select rownum num,id,name from student) t where t.num>2  
//第二條語句可以正常的執行,根據上面的解釋,這個可以理解了吧!  
--  
//2.rownum與order by同時存在的問題  
//當 where 後面有rownum的判斷,並且存在order by時候,rownum的優先順序高!  
//oracle會先執行rownum的判斷,然後從結果中order by,很明顯是錯誤的結果啦!  
//就好像學校要取成績最好的前10名同學,結果這種方法一執行,成了取出10名同學,然後按照成績的高低排序!  
//這點與SQL Server的TOP完全不同,TOP遇上order by,是先執行order by,在分頁的;  
//解決辦法就是先執行order by,然後嵌套執行rownum  
//說白啦就是用()改變函數的優先順序! 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.