Oracle 無 TOP N 語法,標準模式為:
SELECT * FROM (
SELECT * FROM table_name ORDER BY sort_column
) WHERE ROWNUM <= N;
關鍵點:ORDER BY 必須在內層子查詢完成,外層再用 ROWNUM 截取,否則會先取前 N 筆再排序,結果錯誤。
SELECT * FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= 3;
-- 結果: eighth, fifth, first (依 name 字母序)
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= 3
) WHERE recno = 2;
-- 結果: fifth (第 2 筆)
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= 2
) WHERE recno = 2;
-- 結果: fifth (第 2 筆),內層只取 2 筆效能最佳
SELECT id, name FROM (
SELECT ROWNUM recno, id, name FROM (
SELECT * FROM customer ORDER BY name
) WHERE ROWNUM <= (M + X - 1)
) WHERE recno BETWEEN M AND (M + X - 1);
-- 例: 取第 2 筆起 3 筆 (M=2, X=3) → ROWNUM <= 4, recno BETWEEN 2 AND 4
-- 結果: fifth, first, forth
以 START_ROW (起始筆數)、PAGE_SIZE (頁大小) 為參數,動態生成上述 SQL,即可輕鬆實現通用分頁功能。
ROWNUM <= N 能有效限制排序範圍,N 越小效能越好。OFFSET ... FETCH NEXT ... ROWS ONLY 標準語法,更簡潔高效。