1. 程式人生 > >Oracle資料庫中分頁排序

Oracle資料庫中分頁排序

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;

查詢到的資料為:
第2頁分頁資料
其中,第一列是查詢到的rownum的值,最後一列是子查詢中rownum的值.

排序

如果是單純的排序可以用order by來實現,且預設排序規則為asc升序,可以使用desc來設定排序規則為降序.

假設我們要按照房屋面積降序排列,我們可以這麼寫:

select h.* from house_info h order by area desc;

結果是:
面積最大的10條資訊

分頁排序

假設我們要得到按照面積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的值並不會變化.如果要分頁排序,需要多巢狀一層查詢語句.