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の話しが
あったので、関係無いですがコネタとして(^^