LoginSignup
2
2

More than 5 years have passed since last update.

テーブルの途中のN行を取得するいくつかのSQL文

Posted at

ページネーションの実装など、テーブルのN行目から(N + M)行目を取得したい場合、どのようなSQL文を発行すべきでしょうか。まず一番手っ取り早いのは、LIMIT-OFFSETが実装されている場合はそれを使うことです。

SELECT *
FROM table
ORDER BY sort_cond
LIMIT 20 OFFSET 10

あるいは次のような構文(LIMIT 開始位置, 取得行数)も許容されていたような気がします(記憶があいまい)。

SELECT *
FROM table
ORDER BY sort_cond
LIMIT 10, 20

LIMITが実装されていない場合は、次のようにFETCHで代用します。

SELECT *
FROM table
ORDER BY sort_cond
OFFSET 10 ROWS 
FETCH FIRST 20 ROWS ONLY

LIMITOFFSETも利用できない場合はまずROWNUM疑似列の使用を検討します。これは確かOracleで有効だったような……(記憶があいまい)

SELECT *
FROM table
WHERE ROWNUM BETWEEN 10 AND 30
ORDER BY sort_cond

これもだめなら最終手段。ウィンドウ関数のROW_NUMBER()を利用して、無理やり疑似的な行番号を振ってやることになります。

SELECT * 
FROM 
    (SELECT
        col1,
        col2,
        ROW_NUMBER() OVER(ORDER BY sort_cond) AS rownum
    FROM table)
WHERE rownum BETWEEN 10 AND 30
ORDER BY sor_cond

パフォーマンス? 知ったこっちゃねえや

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2