oracle 分頁問題解決方案
昨天做完項(xiàng)目后讓測(cè)試測(cè)試了一把,測(cè)試說分頁查詢貌似不起作用,翻到第4頁以后,看到的數(shù)據(jù)結(jié)果都是相同的。
當(dāng)時(shí)我就覺得很納悶,不可能啊,分頁組件應(yīng)該是好的,咋可能有問題呢。帶著疑問,我打開了自己的ide,在自己的機(jī)器上跑了一把,果然有問題。
有問題就要找問題:
首先把2條查詢結(jié)果相同的sql打印出來到數(shù)據(jù)庫中執(zhí)行:
sql1:
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t
where rownum < 25)
where rn >= 19
sql2:
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t
where rownum <18)
where rn >= 12
結(jié)果顯示大多數(shù)行是相同的。
為了找到問題所在,只有先一步一步的精簡(jiǎn)化sql,看在哪一步出的問題。
于是找到了,問題出現(xiàn)在where rownum<18的時(shí)候數(shù)據(jù)改變了,為什么加了個(gè)where條件結(jié)果就會(huì)變呢?
表示想不通啊。。。。。
沒辦法,只好baidu了,baidu了半天,都沒人給個(gè)解釋啊。。。。。
后來同事說,換個(gè)寫法試試,于是改了另一種寫法,如下:
select *
from (select t.*, rownum rn
from (select t_e_id, t_e_name, t_e_tel, t_e_areacode
from (select t.eid t_e_id,
t.ename t_e_name,
t.etel t_e_tel,
t.areaid t_e_areacode,
t.biz_delete_time,
decode(areaid, '0730', '0', '1') orderseq
from vr_enterprise t
where t.eid not in (select eid from t_biz_erelation))
order by orderseq, biz_delete_time nulls last) t)m
where m.rn >= 1 and m.rn <25
這個(gè)方法果然湊效,湊效是湊效,關(guān)鍵是為什么前面那種方法不行呢?抓問題要刨根問底。
看來baidu不行,得換google搜索了。google搜索總是喜歡被china government墻掉,沒辦法,網(wǎng)上只好找了個(gè)chrome插件才解決了。
找呀找找呀找,在oracle的ask tom上,tom詳細(xì)的介紹了rownum的用法,在這里http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
One important thing about using this pagination query is that the ORDER BY statement should order by something unique. If what you are ordering by is not unique, you should add something to the end of the ORDER BY to make it so.
看到這樣一句話,原來用order by的時(shí)候還需要增加order by的唯一性,不然rownum就會(huì)有問題。哇哈哈哈,太開心了,功夫不費(fèi)有心人呀,找到問題的癥結(jié)了,當(dāng)然就好解決了。
這權(quán)當(dāng)是一次排錯(cuò)的經(jīng)歷,特此記錄下來,看來google還是比baidu強(qiáng)大很多啊,以后要好好學(xué)英文,不然遇到問題沒發(fā)解決。
相關(guān)文章
解決Oracle19c?ORA-00904:“WMSYS“.“WM_CONCAT“:標(biāo)識(shí)符無效問題
這篇文章主要介紹了解決Oracle19c?ORA-00904:“WMSYS“.“WM_CONCAT“:標(biāo)識(shí)符無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
SQL案例學(xué)習(xí)之字符串的合并與拆分方法總結(jié)
這篇文章主要給大家介紹了關(guān)于SQL案例學(xué)習(xí)之字符串的合并與拆分的相關(guān)資料,文中分別介紹了兩種方法,對(duì)大家學(xué)習(xí)或者使用oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-08-08
PLSQL Developer連接Oracle11g 64位數(shù)據(jù)庫配置詳解(圖文)
這篇文章主要介紹了PLSQL Developer連接Oracle11g 64位數(shù)據(jù)庫配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令解析
這篇文章主要介紹了oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令解析,小編覺得還是比較不錯(cuò)的,需要的朋友可以參考下。2017-10-10
Oracle 計(jì)算時(shí)間格式平均值的sql 語句
這篇文章主要介紹了Oracle 計(jì)算時(shí)間格式平均值的sql 語句,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
在oracle 數(shù)據(jù)庫查詢的select 查詢字段中關(guān)聯(lián)其他表的方法
在實(shí)際開發(fā)過程中,特別是在做數(shù)據(jù)查詢的時(shí)候,能夠根據(jù)動(dòng)態(tài)生成的sql語句將查詢的結(jié)果轉(zhuǎn)化并返回到業(yè)務(wù)處理邏輯(或頁面展示出來)能大大的減輕業(yè)務(wù)邏輯的處理復(fù)雜度。2009-08-08

