ROWNUM 是查詢結果集生成時的**順序號**,從 1 開始遞增。WHERE ROWNUM < N 可取前 N-1 行;WHERE ROWNUM > N **永遠返回空集**,因為第一行 ROWNUM=1 不滿足 >N,導致後續行永無機會獲得 ROWNUM=2。WHERE ROWNUM < 4 ORDER BY col 先取前 3 行再排序,非預期的「排序後取前 3」。SELECT t.*, ROWNUM, ROWID FROM table1 t;
-- 發現 ROWNUM 按 ROWID(插入順序)遞增,與業務欄位無關。
SELECT * FROM (
SELECT * FROM table1 ORDER BY aaa
) WHERE ROWNUM < 4;
內層先排序,外層再截取 ROWNUM。
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM table1 ORDER BY aaa
) a WHERE ROWNUM <= :end_row
) WHERE rn > :start_row;
關鍵點:
ROWNUM rn 並限制上界 :end_row。rn 過濾下界 :start_row。此寫法在 10g 及之前版本通用;12c+ 可直接使用 OFFSET ... FETCH NEXT ... 標準語法。