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,表示式...