oracle分頁顯示方法

2021-09-02 18:41:55 字數 4828 閱讀 6142

一、使用rownum分頁顯示方式

方式1:

select *

from (select rownum r, a.* from b$i_exch_info a where rownum <= 10)

where r >= 5;

方式2:

select *

from (select rownum r, a.* from b$i_exch_info a)

where r between 5 and 10;

方式3: 

select * from b$i_exch_info where rownum <= 10 minus

select * from b$i_exch_info where rownum < 5;

二、使用分析函式row_number分頁顯示

select *

from (select e.*, row_number() over(order by g3e_fid) r

from b$i_exch_info e) a

where a.r >= 5

and a.r <= 10;

注意事項

1. --10g及10g之後才可以使用rownum=1

select * from user_objects

where /*object_id <100

and*/ rownum = 1;

--之前的版本  

select * from user_objects

where object_id <100

and rownum <= 1;

2.rownum採用大於號》時 其值必須小於1,否則查詢無結果

select * from user_objects

where rownum >1; 

>= 時其值必須小於或等於1,否則查詢無結果

select * from user_objects

where rownum >=2; 

= 時其只能等於1,否則查詢無結果

select * from user_objects

where rownum =2; 

3.rownum 和order by

在使用rownum 時,只有當order by 的字段是主鍵時,查詢結果才會先排序再計算rownum:

g3e_ano是主鍵

select g3e_ano,g3e_username from g3e_attribute where rownum <= 5 order by g3e_ano;

1        備註

1002    元件序號

1008    元件序號

1009    元件序號

1010    元件序號

--以下查詢因為order by的g3e_username不是主鍵,所以執行時是先線取出該錶的6條資料,再對g3e_username排序

select g3e_ano,g3e_username from g3e_attribute where rownum <= 5 order by g3e_username;

111003    設施特徵唯一號

113203    設施特徵唯一號

50110      設施特徵唯一號

1510103    設施特徵唯一號

112003    設施特徵唯一號

--如果需要對非主鍵欄位先排序再去取前n 條資料,可以通過子查詢的方式實現:

select g3e_ano, g3e_username

from (select g3e_ano, g3e_username

from g3e_attribute

order by g3e_username)

where rownum <= 5;

--每頁按10條記錄輸出(如果被排序的字段有重複值,使用rownum會出現乙個問題):

--觀察下面兩個語句的輸出結果會發現其中55461451和55461209是在兩個查詢中都出現了。而fid在表中都是唯一記錄的,

--說明這個輸出結果是錯誤的

錯誤原因:sort (order by stopkey)這種快速排序方法由於是根據資料分組來選擇資料的,不是根據整個表的資料進行排序,所以n

值不同,資料的分組也不同,導致結果在資料的排序字段值都相等時,輸出結果的順序就會因為n 值不同而不同。

select *

from (select rownum r, a.*

from (select name, g3e_fid from b$l_interest_info a order by name) a

where rownum <= 10)

where r >= 1;

1       王家宅    55461079

2       王家宅    55461206

3       王家宅    55461207

4       王家宅    55461253

5       王家宅    55461246

6       王家宅    55461209

7       王家宅    55461783

8       王家宅    55461646

9       王家宅    55461586

10     王家宅    55461451

select *

from (select rownum r, a.*

from (select name, g3e_fid from b$l_interest_info a order by name) a

where rownum <= 20)

where r >= 11;

11       王家宅    56990485

12       王家宅    56990368

13       王家宅    56981862

14       王家宅    56981861

15       王家宅    56981807

16       王家宅    56981806

17       王家宅    56981801

18       王家宅    55461646

19       王家宅    55461451

20       王家宅    55461209

解決辦法:

1、讓查詢計畫避免「sort (order by stopkey)」,採用「sort (order by)」,使數

據排序不受rownum 的影響。但這樣會使所有資料都做排序:

select *

from (select a.*, rownum r

from (select name, g3e_fid from b$l_interest_info a order by name) a)

where r <= 10

and r >= 1;

select *

from (select a.*, rownum r

from (select name, g3e_fid from b$l_interest_info a order by name) a)

where r <= 20

and r >= 11;

2、在排序時,加上乙個或多個字段(如主鍵字段、rowid),使排序結果具有唯一性:

select *

from (select rownum r, a.*

from (select name, g3e_fid from b$l_interest_info a order by name,g3e_fid) a

where rownum <= 10)

where r >= 1;

select *

from (select rownum r, a.*

from (select name, g3e_fid from b$l_interest_info a order by name,g3e_fid) a

where rownum <= 20)

where r >= 11;

3、對排序字段建立索引,並強制使用索引。這樣就能利用索引已經建立好的排序結果:

create index idx_b$l_interest_info_name on b$l_interest_info(name);

alter index idx_b$l_interest_info_name rebuild;

select *

from (select rownum r, a.*

from (select /*+index(a idx_b$l_interest_info_name)*/

name, g3e_fid

from b$l_interest_info a

where a.name is not null

order by name) a

where rownum <= 10)

where r >= 1;

select *

from (select rownum r, b.*

from (select /*+index(a idx_b$l_interest_info_name)*/

a.name, a.g3e_fid

from b$l_interest_info a

where a.name is not null

order by a.name) b

where rownum <= 20)

where r >= 11;

oracle分頁顯示

oracle中rownum表示行號,比如你想返回前10行,sql如下 select from mytable where rownum 10 如果返回90 100行,那行下面的語句是不對的 select from mytable where rownum 90 and rownum 100 orac...

oracle 分頁方法

基本分頁方法如下 select from select a.rownum rn from select from tablename a where rownum pagenum 1 pagesize pagesize where rn pagenum 1 pagesize 上面是乙個單錶查詢分頁方...

ORACLE分頁方法

1.資料表結構 表名authoring 欄位authoringid number primary key,name varchar 50 not null,startdate date 2.分頁 以startdate逆序分頁 select from select a.row number over ...