0
点赞
收藏
分享

微信扫一扫

oracle分页写法

通用写法:

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)
举报

相关推荐

0 条评论