简明限制 Oracle 中的有序结果
Oracle 的行限制不同于 MySQL 等更简单的 SQL 方言。 MySQL 使用 LIMIT
,而 Oracle 使用 ROWNUM
伪列。 但是,在 ROWNUM
之前的 WHERE
子句中直接使用 ORDER BY
会产生不可预测的结果。
挑战:限量前订购
问题源于ROWNUM
在子句之前ORDER BY
的评估。 这意味着排序后你得不到前 N 行;相反,你会得到 N 任意行。
解决方案:通过子查询进行精确控制
要正确限制 排序后的行,请使用子查询:
<code class="language-sql">SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 10;</code>
首先按工资 (emp
) 降序对 sal
表进行排序,然后外部查询使用 ROWNUM
.
指定开始行和结束行:
为了更精确的控制,定义上限和下限需要嵌套子查询:
<code class="language-sql">SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM emp ORDER BY sal DESC ) a WHERE ROWNUM <= 30 ) WHERE rnum >= 21;</code>
这将在按工资排序后检索第 21-30 行(含)。
现代 Oracle(12c 及更高版本):简化语法
Oracle 12c 及更高版本提供了更简洁的方法:
<code class="language-sql">-- Top 10 results SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY; -- Rows 20-30 SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>
此 FETCH FIRST
和 OFFSET
语法对于分页来说明显更具可读性和效率。 如果您的 Oracle 版本支持,请使用此方法。
以上是下单后如何限制Oracle查询结果?的详细内容。更多信息请关注PHP中文网其他相关文章!