トップN分析、上位 n レコード、 n〜m レコードの取得
SELECT 文 にて条件を伴う上位の n レコードを取得したい場合には ROWNUM によるインラインビューを使用してネストした問い合わせをインライン化するか ROW_NUMBER 分析関数 を使用する。
FETCH FIRST / FETCH NEXT による TOP n 件抽出
SELECT NO FROM ROWNUM_TEST
ORDER BY NO
-- OFFSET 0 ROW / OFFSET 0 ROWS
FETCH FIRST 5 ROWS ONLY ;
"FETCH FIRST ROW" と行数を省略した場合には最初の 1 行が抽出される。
※ FETCH FIRST n ROWs の n に 0以下が設定された場合には 1件も抽出されない。
ROW_NUMBER 分析関数による TOP n 件抽出
ROW_NUMBER() を使用する場合
SELECT NO FROM (
SELECT ROW_NUMBER() OVER (ORDER BY NO) RNO, NO FROM ROWNUM_TEST
)
WHERE RNO <= 5
ORDER BY NO ;
インラインビューによる TOP n 件抽出
SELECT NO FROM (
SELECT NO FROM ROWNUM_TEST
ORDER BY NO
)
WHERE ROWNUM <= 5
ORDER BY NO ;
中間順位での取り出し
OFFSET と FETCH FIRST / FETCH NEXT の場合
OFFSET skip_count ROWS で上位 skip_count 分スキップ
※ skip_count に検索結果の件数より多い数値、または、NULL を指定した場合 1件も抽出されない。
SELECT NO FROM ROWNUM_TEST
ORDER BY NO
OFFSET 4 ROWS
FETCH NEXT 6 ROWS ONLY ;
FETCH FIRST ~でも結果に違いはないが 文脈的に NEXT というだけ
同様に OFFSET 4 ROW でも結果は同じ
TOP 5 以降のすべて
SELECT NO FROM ROWNUM_TEST
ORDER BY NO
OFFSET 4 ROWS ;
ROW_NUMBER 関数 の場合
Top n の取り出しと同じ
SELECT NO FROM (
SELECT ROW_NUMBER() OVER (ORDER BY NO) RNO, NO FROM ROWNUM_TEST
)
WHERE RNO BETWEEN 5 AND 10
ORDER BY NO;
インラインビューの場合
ROW_NUMBER 関数に比べてかなり長くなる
SELECT NO FROM (
SELECT NO, ROWNUM RNO FROM (
SELECT NO FROM ROWNUM_TEST
ORDER BY NO
)
) WHERE RNO BETWEEN 5 AND 10
ORDER BY NO;
SQL 関連事項