Oracleでlimit offsetもどき
postgreSQLにはlimit offsetがあり時には非常に便利な機能。
Oracleの場合、ROWNUMを使って似たような事が出来ます。
Oracleにおいて、HOGEテーブルの検索結果の中から最初の10件を取得したい場合は
select * from HOGE where rownum <= 10;
または
select * from HOGE where rownum between 1 and 10;
とします、これは一般的によく使われる方法と思います。
では、10件目から5件取得したいとなった場合はどうでしょう。
上記と同じように
select * from HOGE where rownum between 10 and 15;
または
select * from HOGE where 10 <= rownum and rownum <= 15;
とすれば良いのでは?と思いますが、実際は意図した結果が得られません。
このSQLだと、最初にfetchされた1行目がROWNUM 1となり
WHERE句内の条件が満たされない為に、取得対象外となります。
Oracleでlimit offsetもどきを行うには以下のようにして取得します。
# HOGEテーブルにはname, ageカラムがあるとします
select name, age from (select name, age, rownum as rn from HOGE) where 10 <= rn and rn <= 15;
もしくは
select name, age from (select name, age, rownum as rn from HOGE) where rn between 10 and 15;
つまり副問い合わせによってROWNUMを確定させてあげてから
範囲指定してデータを取得するという方法でした。
ちょうどmanholeさんとこでlimit offsetの話しが
あったので、関係無いですがコネタとして(^^