サーチ…


行制限句で最初のN行を取得する

FETCH句は、Oracle 12c R1で導入されました。

SELECT   val
FROM     mytable
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

以前のバージョンでも動作するFETCHを使用しない例:

SELECT * FROM (
   SELECT   val
   FROM     mytable
   ORDER BY val DESC
) WHERE ROWNUM <= 5;

SQLでのページネーション

SELECT val 
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   rownum_order_test
                ORDER BY val)
        WHERE rownum <= :upper_limit)
WHERE  rnum >= :lower_limit ;

このようにして、Webデータページと同様にテーブルデータをページ設定することができます

テーブルからN個のレコードを取得する

rownum句を使って結果から行の数を制限することができます

select * from 
( 
  select val from  mytable
) where rownum<=5

最初または最後のレコードが必要な場合は、順序に基づいて結果を返す内部クエリのorder by節が必要です。

最後の5つのレコード:

select * from 
( 
    select val from  mytable order by val desc
) where rownum<=5

最初の5つのレコード

select * from 
( 
    select val from  mytable order by val
) where rownum<=5

多くの行からN〜M行を取得する(Oracle 12cより前)

分析関数row_number()を使用します。

with t as (
  select col1
  , col2
  , row_number() over (order by col1, col2) rn
  from table
)
select col1
, col2
from t
where rn between N and M; -- N and M are both inclusive

Oracle 12cでは、これをOFFSETFETCHより簡単に処理します。

いくつかの行をスキップしてから

Oracle 12g +では、

SELECT Id, Col1
FROM TableName 
ORDER BY Id
OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY;

以前のバージョン

SELECT Id, 
   Col1
 FROM (SELECT Id,
           Col1,
           row_number() over (order by Id) RowNumber
      FROM TableName)
WHERE RowNumber BETWEEN 21 AND 40

結果からいくつかの行をスキップする

Oracle 12g +では、

SELECT Id, Col1
FROM TableName 
ORDER BY Id
OFFSET 5 ROWS;

以前のバージョン

SELECT Id, 
   Col1
 FROM (SELECT Id,
           Col1,
           row_number() over (order by Id) RowNumber
      FROM TableName)
WHERE RowNumber > 20


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow