私の知る限り、次のようなもう1つのレベルのネストが必要になります。
select b.* from (
select a.*, rownum rnum from (
select * from foo order by id
) a where rownum <= 20
) b where b.rnum >= 10;
デモ:
SQL> create table foo (id number);
Table created.
SQL> insert into foo
2 select round(dbms_random.value(0, 1000))
3 from dual
4 connect by level <= 15;
15 rows created.
SQL> commit;
Commit complete.
rownum
お気づきのように、注文前に「具体化」されるため、アプローチは機能しません。
SQL> select foo.*, rownum from foo order by id;
ID ROWNUM
---------- ----------
24 15
148 5
151 2
225 7
234 11
292 1
305 4
351 9
383 8
394 13
426 12
477 10
553 6
594 14
917 3
15 rows selected.
したがって、注文後に行番号を取得するには、一度ネストします。
SQL> select a.*, rownum from (
2 select * from foo order by id
3 ) a;
ID ROWNUM
---------- ----------
24 1
148 2
151 3
225 4
234 5
292 6
305 7
351 8
383 9
394 10
426 11
477 12
553 13
594 14
917 15
15 rows selected.
しかし、これではできませんbetween
:
SQL> select a.*, rownum from (
2 select * from foo order by id
3 ) a where rownum between 5 and 10;
no rows selected
これはrownum
、行が結果セットに入ると値を取得するためです。そして、最初の行を削除するために2番目のレイヤーを追加します。
SQL> select id, rnum from (
2 select id, rownum rnum from (
3 select id from foo order by id
4 ) a where rownum <= 10
5 ) b where b.rnum >= 5;
ID RNUM
---------- ----------
234 5
292 6
305 7
351 8
383 9
394 10
6 rows selected.