ROWNUM 是 Oracle 為查詢結果集動態分配的偽欄位,從 1 開始遞增。理解其產生時機(在 WHERE 過濾之前)是避開陷阱的關鍵。
| 條件類型 | 行為 | 說明 |
|---|---|---|
ROWNUM = 1 | ✅ 可用 | 只取第一筆,常用於限制筆數 |
ROWNUM = N (N>1) | ❌ 無資料 | 因 ROWNUM 從 1 開始,永遠無法直接等於 N |
ROWNUM > N | ❌ 無資料 | 同理,第一筆即被過濾,後續無法產生 |
ROWNUM < N | ✅ 可用 | 可取前 N-1 筆 |
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT * FROM your_table ORDER BY id
) t
WHERE ROWNUM <= :end_row
) WHERE rn >= :start_row;
關鍵點:
ROWNUM 並限制上限(ROWNUM <= end)。rn 過濾下限。-- 錯誤:ROWNUM 依插入順序產生,非排序後順序
SELECT ROWNUM, id, name FROM student ORDER BY name;
-- 正確:子查詢先排序,外層再加 ROWNUM
SELECT ROWNUM, id, name FROM (SELECT * FROM student ORDER BY name);
OFFSET ... FETCH NEXT ... 標準語法,更簡潔高效。掌握 ROWNUM 產生機制,分頁查詢不再踩坑。