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>
.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>
,中间查询基于上限进行过滤,外部查询基于下限进行过滤。 但是,ROWNUM
/OFFSET
方法在 Oracle 12c 及更高版本中仍然是更高效、更易读的选项。FETCH
以上是Oracle 中的 ROWNUM:如何实现正确的分页并避免常见陷阱?的详细内容。更多信息请关注PHP中文网其他相关文章!