原始未分頁查詢sql**如下:
selectrownum
rn,t.
id id,
o.name
yyb,
u.name
xm,t.
mc from
tzdysx t,
tuser u,
lborganization o wheret.
cjr=
u.id and
u.orgid=
o.orgcode andt.
gx =
1 order
by id
結果如下:
rnid
yybxmmc3
49某**總部
管理員測試496
某**總部
管理員持有上港10000股以上
5102
某**總部
管理員十年規劃
14105
某**總部
管理員開發渠道為上海
11106
某**總部
管理員萬科a
12107
某**總部
管理員11
13108
某**總部
管理員今天過生日的客戶
2109
某**總部
管理員客戶狀態正常
6110
某**總部
管理員無交易
7111
某**總部
管理員oa
8112
某**總部
管理員幸運客戶
9113
某**總部
管理員風險型
10114
某**總部
管理員tst
22115
白沙網上交易
安昌彪安客戶正常
1118
某**總部
管理員213
18119
某**總部
管理員客戶號包含1008
17120
某**總部
管理員aaa
19123
某**總部
管理員ssssssss
20124
某**總部
管理員www
21126
某**總部
管理員123123
15127
某**總部
管理員1212
16128
某**總部
管理員aaaaaa
22 rows selected 最初我使用如下sql**查詢:
select*from
(select
rownum
rn,t.
id id,
o.name
yyb,
u.name
xm,t.
mc from
tzdysx t
,tuser u,
lborganization o wheret.
cjr=
u.id and
u.orgid=
o.orgcode andt.
gx =
1 orderbyt
.id )
where
rn>
10 and
rn<
=20;
這種方法能成功分頁,結果如下:
rnid
yybxm
mc14
105某**總部
管理員開發渠道為上海
11106
某**總部
管理員萬科a
12107
某**總部
管理員11
13108
某**總部
管理員今天過生日的客戶
18119
某**總部
管理員客戶號包含1008
17120
某**總部
管理員aaa
19123
某**總部
管理員ssssssss
20124
某**總部
管理員www
15127
某**總部
管理員1212
16128
某**總部
管理員aaaaaa
10 rows selected
從結果看來,有個問題:此語句sql**
order by cjsj desc 被執行,但是是在分後的第11到20條記錄的結果集中再進行排序,而不是先排序後分頁。(本來希望顯示id為112到126,結果變為105到128)
後來變為以下sql**查詢:
sql code
複製**
select*from
(select
rownum
rn,ta.*
from
(selectt.
id id,
o.name
yyb,
u.name
xm,t.
mc
from
tzdysx t
,tuser u,
lborganization o
wheret.
cjr=
u.id and
u.orgid=
o.orgcode andt.
gx =
1 orderbyt
.id
)ta where
rownum
<
= 20
)where
rn >
10 select
*from
(select
rownum
rn,ta.*
from
(selectt.
id id,
o.name
yyb,
u.name
xm,t.
mcfrom
tzdysx t
,tuser u,
lborganization o
wheret.
cjr=
u.id and
u.orgid=
o.orgcode andt.
gx =
1 orderbyt
.id)ta where
rownum
<
= 20
)where
rn >
10
結果如下:
rnid
yybxm
mc11
112某**總部
管理員幸運客戶
12113
某**總部
管理員風險型
13114
某**總部
管理員tst
14115
白沙網上交易
安昌彪安客戶正常
15118
某**總部
管理員213
16119
某**總部
管理員客戶號包含1008
17120
某**總部
管理員aaa
18123
某**總部
管理員ssssssss
19124
某**總部
管理員www
20126
某**總部
管理員123123
10 rows selected
看來結果是正確的。
總結:第二種方法其中最內層的查詢sql**
selectt.id id,
o.name
yyb,
u.name
xm,t.
mc
from
tzdysx t
,tuser u,
lborganization o
wheret.
cjr=
u.id and
u.orgid=
o.orgcode andt.
gx =
1 orderbyt
.id
表示不進行翻頁的原始查詢語句。rownum <= 20和rn > 10控制分頁查詢的每頁的範圍。
第二種方法在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,在上面的分頁查詢語句中,這種考慮主要體現在where rownum <= 20這句上。
選擇第11到20條記錄存在兩種方法,第二種方法正是在查詢的第二層通過rownum <= 20來控制最大值,在查詢的最外層控制最小值。而第一種方法是去掉查詢第二層的where rownum <= 20語句,在查詢的最外層控制分頁的最小值和最大值。
一般來說,第二個查詢的效率比第乙個高得多,這是由於cbo 優化模式下,oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第二個查詢語句,第2層的查詢條件where rownum <= 20就可以被oracle推入到內層查詢中,這oracle查詢的結果一旦超過了rownum限制條件,就終止查詢將結果返回了。
而第乙個查詢語句,由於查詢條件where rn>10 and rn<=20是存在於查詢的第三層,而oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道rn代表什 麼)。因此,對於第乙個查詢語句,oracle最內層返回給中間層的是所有滿足條件的資料,而中間層返回給最外層的也是所有資料。資料的過濾在最外層完 成,顯然這個效率要比第二個查詢低得多。
這種分頁對於單錶查詢、多表查詢一樣有效。
oracle中分頁查詢
上限條件必須放在子查詢,而下限條件必須放在外層查詢 rownum總是從1開始的,第一條不滿足去掉的話,第二條的rownum 又成了1 select from select rownum rowno,t.from tab t where rownum page size tab alias where...
Oracle中分頁查詢介紹
設有a表,pageindex 頁號 pagesize 頁大小 我們知oracle中提供了rownum欄位,我們可利用它實現分頁查詢 具體如 step1 先獲得乙個較大的父集,在構成此集合的過程中我們可以構建一定查詢規則 sql code select rownum as r,a.from a a o...
Oracle中分頁查詢語句
oracle分頁查詢語句基本上可以按照本文給出的格式來進行套用。oracle分分頁查詢格式 select from select a.rownum rn from select from table name a where rownum 40 where rn 21 其中最內層的查詢select ...