解決oracle數(shù)據(jù)庫分頁中order by后數(shù)據(jù)重復問題
在開發(fā)系統(tǒng)軟件時,經(jīng)常會使用oracle數(shù)據(jù)庫分頁查詢。然而,最近我發(fā)現(xiàn)即使分頁sql組裝正確,每次點擊下一頁顯示的數(shù)據(jù)都是一樣的。本文將簡要介紹解決此問題的思路。分頁sql示例我的分頁sql如下所示
在開發(fā)系統(tǒng)軟件時,經(jīng)常會使用oracle數(shù)據(jù)庫分頁查詢。然而,最近我發(fā)現(xiàn)即使分頁sql組裝正確,每次點擊下一頁顯示的數(shù)據(jù)都是一樣的。本文將簡要介紹解決此問題的思路。
分頁sql示例
我的分頁sql如下所示:
```sql
select *
from(
select rownum rowno, tt.*
from(
select a.*
from ...
where ...
order by ..., lrsj
) tt
where rownum < n1
) table_alias
where table_ > n2
```
在查詢過程中,n1和n2的配置為20、11,30、21,40、31等時,查詢出的數(shù)據(jù)會有重復。
問題分析
經(jīng)過分析發(fā)現(xiàn),根據(jù)jgdm排序后,當jgdm相同的數(shù)據(jù)有很多個時,并沒有給它一個排序規(guī)則。也就是說,不能保證每次分頁查詢時的記錄的rownum一致。因此得到的數(shù)據(jù)也不是我們預想的。經(jīng)過測試,的確如此。
解決方法一:修改order by字段
第一種解決方法是修改select語句后的order by字段,使排序規(guī)則有效。比如,可以首先按機構(gòu)排序,然后按主鍵排序,或者干脆按rowid排序。不過后者可能沒有什么業(yè)務含義。由于是生產(chǎn)環(huán)境,不便于修改程序,因此我沒有采用此方法解決。
解決方法二:修改排序字段數(shù)據(jù)內(nèi)容
第二種解決方法是修改排序字段的數(shù)據(jù)內(nèi)容。由于排序字段數(shù)據(jù)重復,導致排序結(jié)果無規(guī)則。為了先解決問題,我選擇了修改數(shù)據(jù)內(nèi)容,使排序有效。在這里需要一些技巧,如何修改lrsj字段值保證排序有效,而又不改變時間字段太多。我的做法是將lrsj值修改為lrsj rownum/24/60/60,即按行號增加1秒。具體的sql如下:
```sql
update ... a
set (
select rn/24/60/60
from(
select rid, rownum rn, a.*
from ... a
) b
where b.rid
)
```
通過修改后,分頁查詢數(shù)據(jù)顯示正常,不再出現(xiàn)重復值了。