昨天做完項目後讓測試測試了一把測試說分頁查詢貌似不起作用翻到第頁以後看到的數據結果都是相同的
當時我就覺得很納悶不可能啊分頁組件應該是好的咋可能有問題呢帶著疑問我打開了自己的ide在自己的機器上跑了一把果然有問題
有問題就要找問題
首先把條查詢結果相同的sql打印出來到數據庫中執行
sql
復制代碼 代碼如下:
select *
from (select t* rownum rn
from (select t_e_id t_e_name t_e_tel t_e_areacode
from (select teid t_e_id
tename t_e_name
tetel t_e_tel
tareaid t_e_areacode
_delete_time
decode(areaid ) orderseq
from vr_enterprise t
where teid not in (select eid from t_biz_erelation))
order by orderseq biz_delete_time nulls last) t
where rownum < )
where rn >=
sql
select *
from (select t* rownum rn
from (select t_e_id t_e_name t_e_tel t_e_areacode
from (select teid t_e_id
tename t_e_name
tetel t_e_tel
tareaid t_e_areacode
_delete_time
decode(areaid ) orderseq
from vr_enterprise t
where teid not in (select eid from t_biz_erelation))
order by orderseq biz_delete_time nulls last) t
where rownum <)
where rn >=
結果顯示大多數行是相同的
為了找到問題所在
只有先一步一步的精簡化sql
看在哪一步出的問題
於是找到了
問題出現在where rownum<
的時候數據改變了
為什麼加了個where條件結果就會變呢?
表示想不通啊
沒辦法
只好baidu了
baidu了半天
都沒人給個解釋啊
後來同事說
換個寫法試試
於是改了另一種寫法
如下
復制代碼 代碼如下:
select *
from (select t* rownum rn
from (select t_e_id t_e_name t_e_tel t_e_areacode
from (select teid t_e_id
tename t_e_name
tetel t_e_tel
tareaid t_e_areacode
_delete_time
decode(areaid ) orderseq
from vr_enterprise t
where teid not in (select eid from t_biz_erelation))
order by orderseq biz_delete_time nulls last) t)m
where mrn >= and mrn <
這個方法果然湊效
湊效是湊效
關鍵是為什麼前面那種方法不行呢?抓問題要刨根問底
看來baidu不行
得換google搜索了
google搜索總是喜歡被china government牆掉
沒辦法
網上只好找了個chrome插件才解決了
找呀找找呀找
在oracle的ask tom上
tom詳細的介紹了rownum的用法
在這裡l
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的時候還需要增加order by的唯一性
不然rownum就會有問題
哇哈哈哈
太開心了
功夫不費有心人呀
找到問題的症結了
當然就好解決了
這權當是一次排錯的經歷
特此記錄下來
看來google還是比baidu強大很多啊
以後要好好學英文
不然遇到問題沒發解決
From:http://tw.wingwit.com/Article/program/Oracle/201405/30859.html