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