oracle分頁查詢

2022-08-29 00:42:21 字數 1311 閱讀 4515

最近研究了一下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...