溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

oracle分頁查詢結(jié)果集重復(fù)問題&解決方法

發(fā)布時間:2020-08-10 11:26:20 來源:網(wǎng)絡(luò) 閱讀:1935 作者:GeeYL 欄目:關(guān)系型數(shù)據(jù)庫

做項目時,無意間發(fā)現(xiàn)了分頁上的一個bug,在此記錄一下:

首先手動將后臺輸出的sql語句復(fù)制進(jìn)oracle中查看,以便排查錯誤,對比以下視圖前10條的結(jié)果集與10到20條的結(jié)果集,發(fā)現(xiàn)大部分記錄出現(xiàn)重復(fù)現(xiàn)象,SQL語句如下:

--前10條記錄
select *

  from (select row_.*, rownum rownum_

          from (select t.idcard, count(1)

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard

                 order by count(1) asc) row_

         where rownum <= 10)

 where rownum_ > 0;

--第11條-第20條記錄
select *

  from (select row_.*, rownum rownum_

          from (select t.idcard, count(1)

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard

                 order by count(1) asc) row_

         where rownum <= 20)

 where rownum_ > 10;

出現(xiàn)以上錯誤時,先是反復(fù)增加/刪除where之后的條件,不斷測試,貌似發(fā)現(xiàn)了一些端倪,錯誤記錄都發(fā)生在count(1)的值相同時,于是在網(wǎng)上好一陣搜索,可還是沒有找到解決辦法;


沒辦法了,最后還是硬著頭皮去找官網(wǎng)的一些demo,從中觀察用法,探索者、摸索著,就有了以下的版本,經(jīng)測試可以返回正確結(jié)果集,修改后如下:

select *

  from (select row_1.*, rownum rownum_

          from (select * from (select t.idcard idcard, count(1) total

                  from sampling.v_unvoucher_blacklist t

                 where 1 = 1

                 group by t.idcard)

                 order by total,rownum asc) row_1

         where rownum <= 10)

 where rownum_ > 0;

總結(jié):order by語句應(yīng)當(dāng)遵循條件唯一性原則,否則oracle不保證每次查詢的結(jié)果集都相同。


詳細(xì)介紹請參考o(jì)racle官網(wǎng):

http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI