トップN分析、上位 n レコード、 n〜m レコードの取得

SELECT 文 にて条件を伴う上位の n レコードを取得したい場合には ROWNUM によるインラインビューを使用してネストした問い合わせをインライン化するか ROW_NUMBER 分析関数 を使用する。

FETCH FIRST / FETCH NEXT による TOP n 件抽出 Oracle 12c

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 の場合 Oracle 12c

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 関連事項

TOP n レコードの取得の関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)