教您如何解決oracle分頁查詢數(shù)據(jù)重復(fù)問題
oracle分頁查詢時(shí),會(huì)遇到數(shù)據(jù)重復(fù)的問題,下面就教您一個(gè)解決oracle分頁查詢數(shù)據(jù)重復(fù)問題的方法,希望對(duì)您能夠有所幫助。
在oracle分頁查詢中,我們采用類似以下所示的公認(rèn)的比較高效的數(shù)據(jù)庫分頁查詢語句(Effective Oracle by Design中有描述、眾多oracle使用者也做過測(cè)試)。
寫道
- SELECT * FROM
- (
- SELECT A.*, ROWNUM RN
- FROM (SELECT * FROM TABLE_NAME) A
- WHERE ROWNUM <= n)
- WHERE RN > m
這里的ROWNUM是一個(gè)偽列,它是oracle為查詢結(jié)果所編的一個(gè)號(hào),***行的 ROWNUM為1,第二行為2,以此類推。
因?yàn)閛racle是按塊進(jìn)行讀取數(shù)據(jù)的,如果數(shù)據(jù)按順序存儲(chǔ),則可能使讀取出來的數(shù)據(jù)是按順序的,給用戶誤解為默認(rèn)排序。事實(shí)上,oracle沒有進(jìn)行任何排序操作,如果sql沒有要求排序,oracle會(huì)順序的從數(shù)據(jù)塊中讀取符合條件的數(shù)據(jù)返回到客戶端。所以在沒有使用排序sql的時(shí)候,分頁返回的數(shù)據(jù)可能是按順序的,也可能是雜亂無章的,這都取決與數(shù)據(jù)的存儲(chǔ)位置。在oracle分頁查詢過程中,如果數(shù)據(jù)的物理位置發(fā)生了改變,就可能會(huì)引起分頁數(shù)據(jù)重復(fù)的現(xiàn)象。
所以,要正確使用oracle分頁查詢,sql語句中必須有排序條件。
但是,在有排序條件的時(shí)候,仍然會(huì)出現(xiàn)數(shù)據(jù)重復(fù)的現(xiàn)象,這是為什么呢?
通過了解oracle的排序機(jī)理就會(huì)明白,出現(xiàn)這種情況的原因是因?yàn)榕判蛄兄档牟?**性。 Oracle這里使用的排序算法不具有穩(wěn)定性,也就是說,對(duì)于鍵值相等的數(shù)據(jù),這種算法完成排序后,不保證這些鍵值相等的數(shù)據(jù)保持排序前的順序。
解決的方法是在后邊增加一個(gè)***性列,比如主鍵。
所以解決方法如下(兩個(gè)條件必須同時(shí)滿足):
1.sql語句中需要有排序條件。
2.排序條件如果沒有***性,那么必須在后邊跟上一個(gè)***性的條件,比如主鍵。
【編輯推薦】