之前有寫過同樣類似的一篇分頁從資料庫就做好,不過那個是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