SQL Server 可直接用 TOP + ROW_NUMBER() OVER;Oracle 僅有 ROWNUM 偽欄位,且 ROWNUM 在 WHERE 條件評估前產生,導致無法直接用 ROWNUM BETWEEN 11 AND 20,必須採用雙層巢狀查詢。
SELECT * FROM test_table WHERE ROWNUM <= 10;
SELECT * FROM (SELECT test_table.*, ROWNUM rn FROM test_table WHERE ROWNUM <= 20) WHERE rn > 10;
SELECT * FROM (SELECT * FROM test_table ORDER BY name ASC) WHERE ROWNUM <= 10;
SELECT *
FROM (SELECT tt.*, ROWNUM rn
FROM (SELECT * FROM test_table ORDER BY name ASC) tt
WHERE ROWNUM <= 20)
WHERE rn > 10;
SELECT * FROM test_table ORDER BY name ASC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
優點:語意清晰、優化器可直接最佳化、支援 FIRST_ROWS(n) 提示。生產環境建議優先使用。
OFFSET 100000 仍需掃描前 10 萬列。大資料量改用 Keyset Pagination (WHERE id > :last_id ORDER BY id FETCH FIRST 10 ROWS ONLY)。ORDER BY 欄位應有索引,避免 SORT ORDER BY 操作。