首页 >数据库 >mysql教程 >下单后如何限制Oracle查询结果?

下单后如何限制Oracle查询结果?

DDD
DDD原创
2025-01-25 08:32:09325浏览

How to Limit Oracle Query Results After Ordering?

简明限制 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.

仅选择前 10 行

指定开始行和结束行:

为了更精确的控制,定义上限和下限需要嵌套子查询:

<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 FIRSTOFFSET 语法对于分页来说明显更具可读性和效率。 如果您的 Oracle 版本支持,请使用此方法。

以上是下单后如何限制Oracle查询结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn