//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
//說白啦就是用()改變函數的優先順序!