Oracle 12cより新たにSELECT文の結果として返される行の数を制限することが出来るようになりました。
行の数を制限するにはSELECT文にOFFSET句とFETCH句を使用します。
OFFSET句はスキップする行数を指定します。
例えば「OFFSET 1 ROWS」と指定した場合は、先頭の1行をスキップします。
FETCH句は返される行数もしくは行の割合を指定します。
例えば「FETCH FIRST 3 ROWS」と指定した場合は、3行分を取り出します。
行の数を制限するにはSELECT文にOFFSET句とFETCH句を使用します。
OFFSET句はスキップする行数を指定します。
例えば「OFFSET 1 ROWS」と指定した場合は、先頭の1行をスキップします。
FETCH句は返される行数もしくは行の割合を指定します。
例えば「FETCH FIRST 3 ROWS」と指定した場合は、3行分を取り出します。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1001 佐藤 500000
1004 田中 355000
1003 高橋 300000
1009 小林 300000
1006 伊藤 300000
1012 吉田 295000
1007 山本 285000
1005 渡辺 280000
1013 山田 280000
1008 中村 245000
1014 佐々木 230000
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1002 鈴木 200000
1010 斉藤 150000
1011 加藤 110000
14行が選択されました。
行制限する前の表には14行のデータが存在しています。
ソートキーをSAL列にして、大きい順にソートしています。
先頭5行をスキップ(OFFSET)して、 3行分取り出し(FETCH)ています。
FETCH句の最後にWITH TIESを付与すると、取り出した最後の行のソートキーの値と同じ値の行が全て返されます。
7行が選択されました。
5行スキップした後の、上位50%を取り出しています。
OFFSET句を省略した場合、FETCH句で先頭の行から取り出します。
9行が選択されました。
FETCH句を省略した場合、スキップした後の全ての行が取り出されます。
行制限する前の表には14行のデータが存在しています。
ソートキーをSAL列にして、大きい順にソートしています。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC
4 OFFSET 5 ROWS
5 FETCH FIRST 3 ROWS ONLY;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1012 吉田 295000
1007 山本 285000
1005 渡辺 280000
先頭5行をスキップ(OFFSET)して、 3行分取り出し(FETCH)ています。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC
4 OFFSET 5 ROWS
5 FETCH FIRST 3 ROWS WITH TIES;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1012 吉田 295000
1007 山本 285000
1005 渡辺 280000
1013 山田 280000 FETCH句の最後にWITH TIESを付与すると、取り出した最後の行のソートキーの値と同じ値の行が全て返されます。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC
4 OFFSET 5 ROWS
5 FETCH FIRST 50 PERCENT ROWS ONLY;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1012 吉田 295000
1007 山本 285000
1005 渡辺 280000
1013 山田 280000
1008 中村 245000
1014 佐々木 230000
1002 鈴木 200000
5行スキップした後の、上位50%を取り出しています。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC
4 FETCH FIRST 3 ROWS ONLY;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1001 佐藤 500000
1004 田中 355000
1003 高橋 300000 OFFSET句を省略した場合、FETCH句で先頭の行から取り出します。
SQL> SELECT empno,ename,sal
2 FROM employees
3 ORDER BY sal DESC
4 OFFSET 5 ROWS;
EMPNO ENAME SAL
---------- ---------------------------------------- ----------
1012 吉田 295000
1007 山本 285000
1005 渡辺 280000
1013 山田 280000
1008 中村 245000
1014 佐々木 230000
1002 鈴木 200000
1010 斉藤 150000
1011 加藤 110000
FETCH句を省略した場合、スキップした後の全ての行が取り出されます。