Oracle資料庫中分頁排序
阿新 • • 發佈:2019-02-04
Oracle分頁的實現
Oracle中分頁是使用rownum實現的,可以根據頁數和每頁條數限制rownum的取值範圍.
house_info表資訊
有下面一個表,表名是house_info,表結構如下:
分頁
計算rownum的取值範圍
rownum的取值範圍跟頁數和每頁條數有關,同時也跟SQL語句中運算子有關.
假設每頁條數pagesize為5,取第2頁的資料,則rownum的取值範圍為:
startIndex=(2-1)*5;
endIndex=2*5;
實現分頁
select tmp.* from
(select h.*,rownum rn from house_info h where rownum <= 10) tmp
where tmp.rn >5;
查詢到的資料為:
其中,第一列是查詢到的rownum的值,最後一列是子查詢中rownum的值.
排序
如果是單純的排序可以用order by來實現,且預設排序規則為asc升序,可以使用desc來設定排序規則為降序.
假設我們要按照房屋面積降序排列,我們可以這麼寫:
select h.* from house_info h order by area desc;
結果是:
分頁排序
假設我們要得到按照面積area降序排序之後第2頁的房屋資訊,我們該怎麼寫?
我們也許會這麼寫:
select tmp.* from
(select h.*,rownum rn from house_info h where rownum <= 10 order by area desc) tmp
where tmp.rn >5;
但是,這樣的結果是:
這跟我們的預期不一樣,我們預期的資料是:
為什麼會出現這樣的情況?
分頁排序這裡有一個注意事項,就是order by 之後,並不改變查詢到的資料的rownum的值.
所以,這麼寫我們得到的是先查詢到第2頁的資料,接著對第2頁的資料進行排序.
而我們需要做的是先對資料進行排序,然後得到第2頁的資料.
那麼我們就要對語句進行更改:
select temp.* from
(select tmp.*,rownum rn from
(select h.* from house_info h order by area desc) tmp
)temp
where temp.rn >5 and temp.rn <=10;
這樣得到的資料才是正確的資料.
總結:
注意在Oracle資料庫中,使用order by 語句時,rownum的值並不會變化.如果要分頁排序,需要多巢狀一層查詢語句.