程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 教您如何解決oracle分頁查詢數據重復問題

教您如何解決oracle分頁查詢數據重復問題

編輯:Oracle數據庫基礎

Oracle分頁查詢時,會遇到數據重復的問題,下面就教您一個解決Oracle分頁查詢數據重復問題的方法,希望對您能夠有所幫助。

在Oracle分頁查詢中,我們采用類似以下所示的公認的比較高效的數據庫分頁查詢語句(Effective Oracle by Design中有描述、眾多Oracle使用者也做過測試)。

寫道

  1. SELECT * FROM  
  2. (  
  3. SELECT A.*, ROWNUM RN  
  4. FROM (SELECT * FROM TABLE_NAME) A  
  5. WHERE ROWNUM <= n)  
  6. WHERE RN > m 

這裡的ROWNUM是一個偽列,它是Oracle為查詢結果所編的一個號,第一行的 ROWNUM為1,第二行為2,以此類推。

因為oracle是按塊進行讀取數據的,如果數據按順序存儲,則可能使讀取出來的數據是按順序的,給用戶誤解為默認排序。事實上,oracle沒有進行任何排序操作,如果sql沒有要求排序,oracle會順序的從數據塊中讀取符合條件的數據返回到客戶端。所以在沒有使用排序sql的時候,分頁返回的數據可能是按順序的,也可能是雜亂無章的,這都取決與數據的存儲位置。在Oracle分頁查詢過程中,如果數據的物理位置發生了改變,就可能會引起分頁數據重復的現象。

所以,要正確使用Oracle分頁查詢,sql語句中必須有排序條件。

但是,在有排序條件的時候,仍然會出現數據重復的現象,這是為什麼呢?

通過了解oracle的排序機理就會明白,出現這種情況的原因是因為排序列值的不唯一性。 Oracle這裡使用的排序算法不具有穩定性,也就是說,對於鍵值相等的數據,這種算法完成排序後,不保證這些鍵值相等的數據保持排序前的順序。

解決的方法是在後邊增加一個唯一性列,比如主鍵。

所以解決方法如下(兩個條件必須同時滿足):

1.sql語句中需要有排序條件。

2.排序條件如果沒有唯一性,那麼必須在後邊跟上一個唯一性的條件,比如主鍵。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved