rownum的使用 分頁

2021-09-06 04:54:22 字數 4817 閱讀 3800

oracle分頁顯示方法

一、使用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;

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;

使用ROWNUM實現分頁

原文 含 釋 1 rownum是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽欄位可以用於限制查詢返回的總行數。2 rownum不能以任何基表的名稱作為字首。使用方法 現有乙個商品銷售表sale,表結構為 month char 6 月份 sell...

Oracle中使用rownum分頁

oracle的常用分頁就是rownum,在公司中也是使用rownum分頁。在oracle中分頁和mysql中不一樣,在mysql中由limit x,y這種形式分頁,而在oracle中常用分頁就是使用rownum分頁,相當於限定行數,從0行到多少行。rownum分頁必須從rownum 0開始,然後ro...

oracle分頁,rownum的使用與理解

rownum可以理解為是乙個虛列 虛列 虛列 假設student學生表中有20條資料 兩種情況 select from student where rownum 10 或select from student where rownum 10 where rownum 表示式 rownum 1,表示式...