首頁 > 資料庫 > mysql教程 > Oracle 中的 ROWNUM:如何實現正確的分頁並避免常見陷阱?

Oracle 中的 ROWNUM:如何實現正確的分頁並避免常見陷阱?

Patricia Arquette
發布: 2025-01-19 06:18:10
原創
527 人瀏覽過

ROWNUM in Oracle: How to Achieve Proper Pagination and Avoid Common Pitfalls?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板