一次oracle分頁所遇到的問題

來源:互聯網
上載者:User

昨天做完項目後讓測試測試了一把,測試說分頁查詢貌似不起作用,翻到第4頁以後,看到的資料結果都是相同的。

當時我就覺得很納悶,不可能啊,分頁組件應該是好的,咋可能有問題呢。帶著疑問,我開啟了自己的ide,在自己的機器上跑了一把,果然有問題。

有問題就要找問題:

首先把2條查詢結果相同的sql列印出來到資料庫中執行:

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

結果顯示大多數行是相同的。

為了找到問題所在,只有先一步一步的精簡化sql,看在哪一步出的問題。

於是找到了,問題出現在where rownum<18的時候資料改變了,為什麼加了個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 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

這個方法果然湊效,湊效是湊效,關鍵是為什麼前面那種方法不行呢?抓問題要刨根問底。

看來baidu不行,得換google搜尋了。google搜尋總是喜歡被china government牆掉,沒辦法,網上只好找了個chrome外掛程式才解決了。

找呀找找呀找,在oracle的ask tom上,tom詳細的介紹了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的時候還需要增加order by的唯一性,不然rownum就會有問題。哇哈哈哈,太開心了,功夫不費有心人呀,找到問題的癥結了,當然就好解決了。

這權當是一次排錯的經曆,特此記錄下來,看來google還是比baidu強大很多啊,以後要好好學英文,不然遇到問題沒發解決。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.