如何解決oracle分頁查詢資料重複問題

2021-07-22 18:49:25 字數 1000 閱讀 2441

本文**:未作修改。

oracle分頁查詢時,會遇到資料重複的問題,下面就教您乙個解決oracle分頁查詢資料重複問題的方法,希望對您能夠有所幫助。

在oracle分頁查詢中,我們採用類似以下所示的公認的比較高效的資料庫分頁查詢語句(effective oracle by design中有描述、眾多oracle使用者也做過測試)。

寫道

select * from  

(  select a.*, rownum rn  

from (select * from table_name) a  

where rownum 

<

= n)  

where rn 

>

m

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

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

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

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

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

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

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

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

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

mysql如何解決深度分頁問題

我們一般做深度分頁的時候,sql語句往往如下 select from tb test order by id desc limit 10000,20 limit 10000 20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行。如果是limit 1000000 100,需要...

如何解決Oracle死鎖問題

解決oracle死鎖問題步驟 出現問題 使用jdbc進行批量插入,一直卡在執行介面上,不走 預估應該是產生了死鎖 使用如下語句查詢oracle資料庫中的死鎖的表和死鎖型別 1 select b.owner,b.object name,a.session id,a.locked mode from v...

oracle如何解決鎖表問題

oracle如何解決鎖表問題 oracle在日常開發過程中,或者業務上線使用過程中,我們會經常遇到鎖表問題,導致某乙個業務奔潰。這是因為當多個使用者同時操作乙個表時,或者同一條資料時,很容易發生鎖表的情況。這是,由於oracle資料庫為了保持資料的一致性,當某乙個使用者正在操作一條資料時,若忘記提交...