ページネーションの実装など、テーブルの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
LIMIT
もOFFSET
も利用できない場合はまず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
パフォーマンス? 知ったこっちゃねえや