OracleのSELECTで範囲を限定する
<Oracle 10gを使っています>
SELECT * FROM (SELECT ROWNUM AS id,name FROM tbl_test WHERE ROWNUM <= 100) WHERE id > 10
rownumは、Oracleが検索結果のレコードに割り振っている番号だ。
このようにすることで検索結果のうち11件目から100件までが返ってくる。
ということは適当に「oracle limit」でぐぐれば、すぐわかる。
だが「なぜ、サブクエリにする必要があるのか?」については見当たらなかった。
SELECT ROWNUM AS id,name FROM tbl_test WHERE ROWNUM <= 100 AND ROWNUM > 10
これで良さそうに見える。
だがこれでは検索結果は0件で何も返ってこない。
原因は「ROWNUM > 10」だ。
ROWNUMのほうが大きいという条件を加えると、そうなってしまう。
その問題の解決する方法は AS を使って別の列を用意してやることだ。
サブクエリの外側でその列を検索条件にする。
これにより先ほどの問題はクリア。
だが「なぜこの方法なら通るのか?」という疑問は解決しない。