Oracle 分頁資料重複的問題
阿新 • • 發佈:2018-12-04
oracle分頁採用三層巢狀+rownum分頁時,如果有order by,就會有一個小坑,一不留神就掉進去了。
前置條件:分頁尾本中存在order by
問題暴露:分頁時好時壞
問題本質:order by 在相同的資料下,排序具有不確定性
解決方法:最簡單的辦法,習慣性在order by後面加rownum或rowid,推薦加rowid
補充:如果有分析函式的情況按照具體情況處理,不可千篇一律
搬磚:
-------------------------------------------------------
今天公司系統中的一個分頁的介面出現了重複資料的問題,檢查之後確認前端分頁控制元件及後臺的SQL語句都沒有問題且該表也沒有存在重複的資料記錄。在繼續分析之後發現是由於排序的欄位出現大批的重複值造成的。
例如以下語句中,ORDER_COLUMN列並不能確定其唯一性,那麼ORACLE在每次執行排序時並不能確定資料的唯一性,導致同樣的排序順序但是每次執行時並不能保證得到一樣的結果。
[sql] view plain copy- SELECT
- *
- FROM
- ( SELECT
- ROW_.*,
- ROWNUM ROWNUM_
- FROM
- ( SELECT
- *
- FROM T
- ORDER BY
- ORDER_COLUMN ) ROW_
- WHERE
- ROWNUM <= 10
- )
- WHERE
- ROWNUM_ > 20
有以上的結論之後處理方法也就簡單明瞭了,Order By中的欄位必須能夠確保唯一即可:
[sql] view plain copy
- SELECT
- *
- FROM
- ( SELECT
- ROW_.*,
- ROWNUM ROWNUM_
- FROM
- ( SELECT
- *
- FROM T
- ORDER BY
- ORDER_COLUMN ,ROWID) ROW_
- WHERE
- ROWNUM <= 10
- )
- WHERE
- ROWNUM_ > 20