Oracle数据库中如何使用ROWNUM或FETCH FIRST实现高效结果集分页?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1022个文字,预计阅读时间需要5分钟。
ROWNUM 和 FETCH FIRST 是 Oracle 中实现分页的两条主要语句,但不能混用,也不能脱离数据库版本选型。Oracle 12c 之前只能依靠 ROWNUM 套子查询;12c 及以后版本应优先使用 OFFSET/FETCH FIRST,这并非因为更高级,而是因为它真正按语义执行——先排序、再跳行、最后截取。
为什么直接 WHERE ROWNUM BETWEEN 不生效
ROWNUM 是在结果集生成过程中动态赋值的,它永远从 1 开始、且只递增,不会跳号。所以 WHERE ROWNUM BETWEEN 11 AND 20 永远为空:第 1 行满足,ROWNUM 被赋为 1;第 2 行进来时,ROWNUM 已经是 2,不满足 BETWEEN 11 AND 20,直接被过滤掉,后续行根本没机会编号。本文共计1022个文字,预计阅读时间需要5分钟。
ROWNUM 和 FETCH FIRST 是 Oracle 中实现分页的两条主要语句,但不能混用,也不能脱离数据库版本选型。Oracle 12c 之前只能依靠 ROWNUM 套子查询;12c 及以后版本应优先使用 OFFSET/FETCH FIRST,这并非因为更高级,而是因为它真正按语义执行——先排序、再跳行、最后截取。
为什么直接 WHERE ROWNUM BETWEEN 不生效
ROWNUM 是在结果集生成过程中动态赋值的,它永远从 1 开始、且只递增,不会跳号。所以 WHERE ROWNUM BETWEEN 11 AND 20 永远为空:第 1 行满足,ROWNUM 被赋为 1;第 2 行进来时,ROWNUM 已经是 2,不满足 BETWEEN 11 AND 20,直接被过滤掉,后续行根本没机会编号。
