簡明限制 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中文網其他相關文章!