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