首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle ROWNUM 偽欄位完全指南:核心機制、常見陷阱與分頁實戰

     編輯:Oracle 資料庫基礎

ROWNUM 是 Oracle 中最常用也最易誤解的偽欄位。許多開發者僅知其「支援 <、<=、!=,不支援 >、>=、=、BETWEEN」的表面規則,卻不懂底層原理,導致查詢結果違背直覺。本文從核心機制出發,徹底解析 ROWNUM 行為邏輯,並提供正確分頁寫法。

核心機制:ROWNUM 的本質

ROWNUM 是在查詢產生結果集後,依序分配給各行的流水號,永遠從 1 開始遞增。 關鍵點:

  • 先有結果集,才有 ROWNUM 賦值
  • 第一筆符合條件的記錄 ROWNUM = 1,第二筆 = 2,以此類推
  • 若第一筆被 ROWNUM > 1 過濾掉,第二筆遞補成為第一筆,ROWNUM 仍為 1,故永無符合條件記錄

經典陷阱解析

查詢條件結果原因
ROWNUM < 10前 9 筆符合直覺,前 9 筆 ROWNUM 1-9 滿足條件
ROWNUM > 10零筆第一筆 ROWNUM=1 不滿足被捨棄,後續遞補皆為 1,永無滿足條件者
ROWNUM != 10前 9 筆第 10 筆 ROWNUM=10 被排除,第 11 筆遞補為 10 又被排除,以此類推
BETWEEN 2 AND 10零筆同理,缺少 ROWNUM=1 導致後續無法產生

正確分頁寫法:子查詢物化 ROWNUM

需先在子查詢中產生 ROWNUM 作為實體欄位,外層再對其篩選:

SELECT *
FROM   (SELECT ROWNUM AS rn, t1.*
        FROM   your_table t1
        WHERE  ...)
WHERE  rn > 10;  -- 現在可正確取得第 11 筆之後資料

此模式為標準分頁實作基礎,配合 rn BETWEEN :start AND :end 即可實現任意頁面查詢。

ROWNUM vs ROWID:本質差異

  • ROWNUM:邏輯偽欄,查詢時動態產生,不儲存於磁碟
  • ROWID:物理位置標識,儲存於資料塊中,唯一且相對穩定(除非資料移動)

因此 ROWID 可直接作為查詢條件,不受 ROWNUM 類限制。

開發必知的四大限制

  1. 不可加表名稱前綴(如 t1.ROWNUM 會報錯)
  2. 子查詢中的 ROWNUM 必須加別名,否則無法區分屬於子查詢還是主查詢
  3. 區間查詢必須使用子查詢物化後再篩選
  4. 搭配 ORDER BY 時,ROWNUM 分配發生在排序前,需用子查詢先排序再取 ROWNUM

總結

理解 ROWNUM「先有結果集、從 1 開始遞增」的核心機制,所有看似詭異的行為皆迎刃而解。掌握子查詢物化技巧,即可靈活實現高效分頁與複雜條件篩選,是 Oracle 開發者的必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved