argius note

プログラミング関連

JavaDB(Derby)のLIMITもしくはROWNUM

条件に合致するレコードの先頭5行だけ表示させたい場合、

# MySQL,PostgreSQLなど
SELECT * FROM TABLE1 LIMIT 5
# Oracle
SELECT * FROM TABLE1 WHERE ROWNUM <= 5

のようにします。
では、JavaDB(Apache Derby)の場合はどう書くのでしょうか。
以前Apacheプロジェクトに昇格した直後くらいのとき(たしか10.2くらい)に調べた時には英語の記事を探しても見つかりませんでした。


あらためて調べてみると、10.4でROW_NUMBER関数が、10.5でOFFSET&FETCH句がサポートされたようです。ちなみに手元にある最新のJRE1.6.0_18に付属しているJavaDBは10.5.3.0です。

ROW_NUMBER関数を使う場合は、

SELECT * FROM (
    SELECT ROW_NUMBER() OVER() AS ROWNUM,
           TABLE1.* FROM TABLE1) AS T
WHERE ROWNUM <= 5

と書きます。これはちょっと使い勝手が悪いし、パフォーマンスもよろしくないようです。


FETCH句を使う場合は、

SELECT * FROM TABLE1 FETCH FIRST 5 ROWS ONLY

と大変分かり易くなりました。「最初の5行だけ取ってくる」ですね。