分頁查詢最好加排序-order by
知識
04-29
昨天,與外部化系統對接時,發現有一個數據一直咩有集成到,雙方各自排查了自己系統的代碼,都覺得邏輯非常簡單,無法就是一個分頁查詢而已。
問題就出在這個分頁查詢上。
為了說明當時問題發生的情景,我模擬了一個SQL查詢:
以上是一段典型的Oracle資料庫的分頁查詢,又以查詢結果集的第1條至第800條數據。
如果想查詢第二頁的數據,只需要改到RN和ROWNUM即可。以下是查第二頁的數據的SQL:
問題背景
上述SQL中從MY_TABLE查詢結果集本身是沒有問題的,因為符合條件的數據總數是不會變的。但是有一個問題,從MY_TABLE查詢的結果集是沒有做排序的,意味著每次查詢的數據的位置可能發生變化。由於分頁查詢,其實是從MY_TABLE查詢查詢了多次,每次數據的位置不確定,導致查詢出來的結果,有可能查得出來,有可能查詢重複。這就是問題的根源。
解決方案
知道問題所在解決起來就簡單了,就是加排序。讓每次查詢出來的數據按到固定位置查出來就沒有了。以下是示例:
一般來說,排序的欄位最好是唯一值。如果是非唯一的欄位,那麼最好用多個能確定唯一性的欄位來實現排序也是可以的。否則無法啟動排序的效果,問題還是會出現。
TAG:千鋒JAVA開發學院 |