通用写法:
select *
from (select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from (select object_id, object_name, LAST_DDL_TIME
from tt
order by 1) a
where ROWNUM <= 200)
where rnum >= 100;
常见错误写法:
select *
from (select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from (select object_id, object_name, LAST_DDL_TIME
from tt
order by 1) a)
where rnum >= 100
and rnum <= 200;
12c+写法:
select object_id, object_name, LAST_DDL_TIME
from tv
order by object_id OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
--------------
执行计划中可以看到使用了ROW_NUMBER
--------------
Execution Plan
----------------------------------------------------------
Plan hash value: 1374781207
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 200 | 22800 | | 1219 (1)| 00:00:01 |
|* 1 | VIEW | | 200 | 22800 | | 1219 (1)| 00:00:01 |
|* 2 | WINDOW SORT PUSHED RANK| | 69665 | 3333K| 4112K| 1219 (1)| 00:00:01 |
| 3 | TABLE ACCESS FULL | TV | 69665 | 3333K| | 370 (1)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("from$_subquery$_002"."rowlimit_$$_rownumber"<=200 AND
"from$_subquery$_002"."rowlimit_$$_rownumber">100)
2 - filter(ROW_NUMBER() OVER ( ORDER BY "OBJECT_ID")<=200)