100日でSQLの達人になる@LeetCode! Day59 <ORDER BY句で使えるOFFSET-FETCH句>


ORDER BY句で使えるOFFSET-FETCH句について理解する

前回に引き続きLeetCodeの問題はお休み。
しばらくLeetCodeの方はお休みしましたが、そろそろ問題の方に戻ろうと思います。
今回のテーマは前回よりは簡単です。
ただコマンドにFETCHと出てくるので前回のCURSORの話と混同しやすいため要注意。

構文

SQL
GROUB BY句の中で
    OFFSET 0以上の整数(式も可) ROWS
    FETCH NEXT 1以上の整数(式も可、FETCHは省略可) ROWS ONLY

これで、先頭からOFFSETで指定した行分スキップし、FETCHで指定した行分取得します。
指定する場合はROWSONLYも忘れずに記載が必要。

前回同様にdb<>fiddleを使います。

実行例

下記が実行例です。

CREATE TABLE tbl (id INT)
DECLARE @num INT =1

WHILE @num <= 50
 BEGIN
  INSERT INTO tbl (id) VALUES(@num)
     SET @num=@num+1
 END
-- ここまでで合計50行の行番号のみ入ったテーブルが出来ています。

--使用例1
SELECT id FROM tbl
 ORDER BY id
 OFFSET 20 ROWS
 FETCH NEXT 10 ROWS ONLY
 
 --使用例2
SELECT id FROM tbl
 ORDER BY id
 OFFSET 45 ROWS;
 
 --使用例3
SELECT id FROM tbl
 ORDER BY id
 OFFSET 45 ROWS
 FETCH NEXT 20 ROWS ONLY

| id |
| -: |
| 21 |
| 22 |
| 23 |
| 24 |
| 25 |
| 26 |
| 27 |
| 28 |
| 29 |
| 30 |

| id |
| -: |
| 46 |
| 47 |
| 48 |
| 49 |
| 50 |

| id |
| -: |
| 46 |
| 47 |
| 48 |
| 49 |
| 50 |

db<>fiddle here

使用例2ではFETCH句を省略していますが、後ろ全部を表示しています。
使用例3ではFETCH句で20行指定していますが5行しか無いため5行分のみ表示しています。

今日のポイントはORDER BY句でOFFSET, FETCHを使って表示する行数をコントロールするとした。