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

Oracle ROWNUM 分頁查詢正確寫法:先排序再分頁,避免 ROWNUM 陷阱

     編輯:Oracle 教學

ROWNUM 運作機制關鍵點

ROWNUM 是在 資料取出後、排序前 分配的偽欄位。直接寫 WHERE ROWNUM BETWEEN 11 AND 20 永遠回傳 0 筆,因為第一筆 ROWNUM=1 不符合 >=11,後續筆數永遠無法成長到 11。

正確三層巢狀寫法

SELECT * 
FROM (
    SELECT ROWNUM rn, a.*
    FROM (
        SELECT * FROM tablename ORDER BY showorder
    ) a
    WHERE ROWNUM <= 20
)
WHERE rn >= 11;

逐層解析

層級作用關鍵點
最內層SELECT * FROM tablename ORDER BY showorder先完成業務排序
中間層SELECT ROWNUM rn, a.* ... WHERE ROWNUM <= 20對已排序結果打標號,並截取前 20 筆
最外層WHERE rn >= 11過濾出第 11-20 筆(rn 為實際欄位可正常比較)

效能驗證

測試千筆資料表,PL/SQL 執行耗時 0.078 秒,等同於僅查前 10 筆的速度。Oracle 能在中間層 ROWNUM <= 20 觸發 COUNT STOPKEY 最佳化,提早終止掃描。

12c+ 更簡潔寫法:OFFSET FETCH

SELECT * FROM tablename
ORDER BY showorder
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

標準 SQL 語法,可讀性高,執行計畫同等最佳化。

常見錯誤對照

-- 錯誤 1:直接 BETWEEN
SELECT * FROM tablename WHERE ROWNUM BETWEEN 11 AND 20 ORDER BY showorder;  -- 0 rows

-- 錯誤 2:排序在外層
SELECT * FROM (SELECT * FROM tablename WHERE ROWNUM <= 20) ORDER BY showorder;  -- 排序錯亂

-- 錯誤 3:未在中間層限制 ROWNUM
SELECT * FROM (SELECT ROWNUM rn, a.* FROM (SELECT * FROM tablename ORDER BY showorder) a) WHERE rn BETWEEN 11 AND 20;  -- 全表掃描
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved