首页 > 数据库 > mysql教程 > Oracle 中的 ROWNUM:如何实现正确的分页并避免常见陷阱?

Oracle 中的 ROWNUM:如何实现正确的分页并避免常见陷阱?

Patricia Arquette
发布: 2025-01-19 06:18:10
原创
527 人浏览过

ROWNUM in Oracle: How to Achieve Proper Pagination and Avoid Common Pitfalls?

Oracle ROWNUM 和分页:常见问题和解决方案

本文解决了在 Oracle SQL 中使用 ROWNUM 进行分页时遇到的常见挑战。

问题 1:无效 WHERE 子句与 ROWNUM

为什么SELECT * FROM Person WHERE rownum > 100没有返回结果?

ROWNUM初始过滤(谓词)阶段之后分配。 由于 值仅在赋值后递增,因此无法以这种方式使用 ROWNUM 子句直接选择大于 1 的值。 没有行满足条件 WHERE.ROWNUM > 100

问题 2: 限制ROWNUM BETWEEN

为什么

不适合分页?WHERE rownum BETWEEN lowerBound AND upperBound

此语法也是无效的,因为

赋值先于 ROWNUM 子句求值。 Oracle 无法直接选择 WHERE 值范围。ROWNUM

解决方案:Oracle 12c 及更高版本(前 n 行限制)

Oracle 12c 引入了一种高级方法:使用

OFFSET 进行“前 n 行限制”。 例如:FETCH

<code class="language-sql">SELECT empno, sal
FROM   emp
ORDER BY sal
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>
登录后复制
这可以有效地检索第 5-8 行(偏移量 4,获取 4)。 此方法优于仅依赖于

.ROWNUM 的技术

问题 3:隐藏 ROWNUM

如何防止

列出现在结果集中?ROWNUM

只需在外部

语句中仅列出所需的列。 或者,在 SQL*Plus 中,您可以使用 SELECT 命令来抑制特定列的输出。NOPRINT

问题 4:使用 确保正确分页(较旧的 Oracle 版本)ROWNUM

能否实现正确分页?ROWNUM

可以,但需要嵌套查询结构:

<code class="language-sql">SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   t
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum >= 5;</code>
登录后复制
这会正确检索第 5-8 行。 内部查询分配

,中间查询基于上限进行过滤,外部查询基于下限进行过滤。 但是,ROWNUM/OFFSET 方法在 Oracle 12c 及更高版本中仍然是更高效、更易读的选项。FETCH

以上是Oracle 中的 ROWNUM:如何实现正确的分页并避免常见陷阱?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板