1. 程式人生 > >Oracle 分頁資料重複的問題

Oracle 分頁資料重複的問題

oracle分頁採用三層巢狀+rownum分頁時,如果有order by,就會有一個小坑,一不留神就掉進去了。

前置條件:分頁尾本中存在order by

問題暴露:分頁時好時壞

問題本質:order by 在相同的資料下,排序具有不確定性

解決方法:最簡單的辦法,習慣性在order by後面加rownum或rowid,推薦加rowid

補充:如果有分析函式的情況按照具體情況處理,不可千篇一律

 

搬磚:

-------------------------------------------------------

 

今天公司系統中的一個分頁的介面出現了重複資料的問題,檢查之後確認前端分頁控制元件及後臺的SQL語句都沒有問題且該表也沒有存在重複的資料記錄。在繼續分析之後發現是由於排序的欄位出現大批的重複值造成的。

例如以下語句中,ORDER_COLUMN列並不能確定其唯一性,那麼ORACLE在每次執行排序時並不能確定資料的唯一性,導致同樣的排序順序但是每次執行時並不能保證得到一樣的結果。

[sql]  view plain  copy  
  1. SELECT  
  2.     *   
  3. FROM  
  4.     ( SELECT  
  5.         ROW_.*,  
  6.         ROWNUM ROWNUM_   
  7.     FROM  
  8.         ( SELECT  
  9.             *  
  10.          FROM  T  
  11.          ORDER BY  
  12.             ORDER_COLUMN ) ROW_   
  13.         WHERE  
  14.             ROWNUM <= 10  
  15.          )   
  16. WHERE  
  17.     ROWNUM_ > 20  

 

有以上的結論之後處理方法也就簡單明瞭了,Order By中的欄位必須能夠確保唯一即可:

 

[sql]  view plain  copy  
    1. SELECT  
    2.     *   
    3. FROM  
    4.     ( SELECT  
    5.         ROW_.*,  
    6.         ROWNUM ROWNUM_   
    7.     FROM  
    8.         ( SELECT  
    9.             *  
    10.          FROM  T  
    11.          ORDER BY  
    12.             ORDER_COLUMN ,ROWID) ROW_   
    13.         WHERE  
    14.             ROWNUM <= 10  
    15.          )   
    16. WHERE  
    17.     ROWNUM_ > 20