据我所知,您需要多一层嵌套,例如:
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
只有在一行进入结果集时才会获取一个值。并添加第二层以删除第一行:
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.