分頁從資料庫就做好RowNum Oracle版

之前有寫過同樣類似的一篇分頁從資料庫就做好,不過那個是MS SQL2005以上的版本,而Oracle也有類似的rownum可以用,但它跟MS SQL的Row_Number有點不同,但還是可以用它來做到同樣的功能.

  之前有寫過同樣類似的一篇分頁從資料庫就做好,不過那個是MS SQL2005以上的版本,而Oracle也有類似的rownum可以用,但它跟MS SQL的Row_Number有點不同,但還是可以用它來做到同樣的功能.

  Oracle的RowNum跟MS SQL的Row_Number最主要要注意的是它的"時機"不同,如果Oracle用了一下的語法,就會查不出資料來.

select * from testTB where rownum>1

如果是以下語法就會有資料.

select * from testTB where rownum>0

這個是因為rownum是從1開始編號,因為第一筆的rownum為1,不會是>1,所以永遠不會有符合的資料回傳.

再來就是它編號的時機.

select *,rownum from testTB order id

直覺上,它的回傳結果會是排序好的,從第一筆的rownum會是連續的從1一直往後增加.

如果是這樣的結果,就沒什麼好提的,會這麼寫,當然就是"它"的編號是在where的條件成立後的資料就先編號,再做order by的動作,因此看到的rownum會是亂跳的情況.

因為這個原因,它拿來做資料庫分頁取回的動作就會跟MS SQL有點不同,但也還好,沒那麼的複雜.

假設我們原本要取的資料的語法如下:

select UserNo,UserName from UserTable where UserQuit=0 order by UserNo

要取出指定的分頁資料只要把這段語法"包"起來就好了.

select * from (select a.*,rownum as rnum from

(

select UserNo,UserName from UserTable where UserQuit=0 order by UserNo

) a

) where rnum>:begin and rnum<:end

如此就可以做好排序,再給編號,再依編號去取出符合編號內的資料.

 

參考 :

On ROWNUM and Limiting Results

MS SQL 分頁做法