最近研究了一下oracle分頁查詢,有了進一步認識,記錄下來和大家分享一下!
分析:假設每頁有10筆資料,第一頁資料為第1-10筆,第二頁資料為11-20筆,如下:
pagenum pagesize formula
1-10 1 10 (1-1)*10+1—1*10
11-20 2 10 (2-1)*10+1—2*10
21-30 3 10 (3-1)*10+1—3*10
有以上分析很容易得出如下演算法,以取行號21-30為例:
演算法1(錯的):
select * from (
/* 獲取排序之前的行號<=30的資料(從students表中查詢時產生rownum,此時未排序)
*/select a.*,rownum rn from students a
where rownum<=30
order by stuno asc
)where rn>=21
還有一種演算法:演算法2(正確):
select * from (
/* 子查詢1
先對students表中的資料排序,然後從排序後的結果集中選出行號<=30的資料,
rn1是從排序後的子查詢2的結果集中查詢時產生的,並非students原表的rownum,比較可知rn1!=rn2
*/select a.*,a.rn2,rownum rn1 from(
/*子查詢2*/
select b.*,rownnum rn2 from students b
order by b.stuno asc
) a where rownum<=30
) where rn1>=21;
到此也行有朋友問:why?(嘿嘿,開始我也看不出來,但測試結果不同),這就不得不提一下偽列rownum的產生時間了, rowunm是在查詢所有資料時產生的(即在排序之前),不會隨排序等而更改,但可以通過子查詢解決這個問題。如果不排序的話,兩種演算法無所謂。
也就是說我們要求的是對所有資料先排序,然後再從排序後的結果集中選資料,即第二種演算法。第一種演算法是先選擇,然後從已選擇的結果集中選出n筆資料,再對這n筆資料排序。
上面第二種演算法的寫法是偽劣便於分析比較,正規寫法如下:
select * from (
select a.*,rownum rn1 from(
select * from students
order by stuno asc
) a where rownum<=30
) where rn1>=21;
ORACLE分頁查詢
單錶分頁 start num 起始行號 end num 截止行號 select t.from select s.rownum rn from table s where rownum end num t where rn start num 多表分頁 select from select temp....
Oracle分頁查詢
oracle的分頁查詢語句基本上可以按照本文給出的格式來進行套用。分頁查詢格式 select from select a.rownum rn from select from table name a where rownum 40 where rn 21 其中最內層的查詢select from t...
oracle 分頁查詢
1 要把rowid來分 select from t xiaoxi where rowid in select rid from select rownum rn,rid from select rowid rid,cid from t xiaoxi order by cid desc where r...