Oracle SQL 取得區間資料

最近在寫Angular7專案 由於考量到資料筆數過大時使用Table呈現效能不如預想

所以打算在使用 table paging時只撈取當下顯示資料部分 切換時再重撈 減少每次所需要的撈取資料量

所以就需要取得某區間的資料 由於之前都使用MS SQL比較多 理想中靠感覺Between就能搞定 但Oracle還有要特別處理的地方 

這部分花了不少時間才搞定 順便做個小記錄

首先我們會有最基礎的搜尋語法

Select ID,NAME,LOCATIONNO 
From UserProfile
WHERE LOCATIONNO = :LOCATIONNO 

接著我們需要排序 排序可以讓我們取區間資料時擁有一定的規則

以及想辦法讓資料每一列都有編號 方便我們取得某一區塊的資料

Select ID,NAME,LOCATIONNO,ROWNUM RM 
From UserProfile
WHERE LOCATIONNO = :LOCATIONNO 
ORDER BY ID

上面是理想應該就會對的做法 但實際上這樣產生出的結果並不是我們需要的 因為Oracle當中 ROWNUM優先於 ORDER BY

所以撈取資料就發現 ROWNUM 不是由低到高

那要怎樣做呢 子查詢 先排序後的結果再加上 ROWNUM 就可以達到我需要的效果

Select UPF.*,ROWNUM RM From 
(
Select ID,NAME,LOCATIONNO
From UserProfile
WHERE LOCATIONNO = :LOCATIONNO 
ORDER BY ID
) UPF

接著呢 排好的ROWNUM都出現了 我可以用 BETWEEN了吧

當然你直接拿WHERE RM 會跟你說沒這鬼玩意

怎麼做呢 子查詢大神又要出來了..

Select * From 
(
  Select UPF.*,ROWNUM RM From 
  (
    Select ID,NAME,LOCATIONNO
    From UserProfile
    WHERE LOCATIONNO = :LOCATIONNO 
    ORDER BY ID
  ) UPF
)
Where RM BETWEEN 10 AND 20

最後取得區間資料完成 或許有更好的寫法

這是我當下研究所得 有更好的方法 請提供給我 

因為這樣其實效能還是有點.....

但比一次撈出來前端直接死機好了...