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 を使って別の列を用意してやることだ。

サブクエリの外側でその列を検索条件にする。

これにより先ほどの問題はクリア。

だが「なぜこの方法なら通るのか?」という疑問は解決しない。