Oracle PL/SQL: 取得排序後的第 n ~ m 筆資料

在 Oracle PL/SQL 中, 要取得排序後的第 n 筆 ~ 第 m 筆資料,

無法利用下面語法取得 :
select *
  from emp
 where rownum >= n and rownum <= m;

解決方式, 如下 :

 取回前 n 筆資料
-- 在 Oracle 12c 以前, 利用 subquery 與 rownum 實現
select b.*
  from (select a.*
          from emp a
         order by a.name
       ) b
 where rownum <= n;
 
-- 在 Oracle 12c 以後, 利用 fetch 即可
select a.*
  from emp a
 order by a.name
 fetch first n rows only;  

 取回第 n ~ m 筆資料
-- 在 Oracle 12c 以前, 利用 subquery 與 rownum 實現
select *
  from (select rownum bRn
             , b.*
          from (select rownum aRn
                     , a.*
                  from emp a
                 order by a.name
               ) b
       )
 where bRn between n and m;
 
-- 在 Oracle 12c 以後, 利用 fetch 與 offset 即可
select a.*
  from emp a
 order by a.name
offset (n-1) rows  -- 略過 n-1 筆, 也就是從第 n 筆開始
 fetch next (m - n + 1) rows only;  -- 取幾筆資料, n ~ m 共有 (m - n + 1) 筆

在 Oracle 12c 之後, 取回第 n ~ m 筆資料的語法, 是不是更為簡單、簡潔、明瞭.

更多關於 offset fetch 用法, 請參考 http://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php.

Related Posts Plugin for WordPress, Blogger...