Oracle 無 TOP 關鍵字,標準做法:內層排序 + 外層 ROWNUM 過濾。
SELECT column_list
FROM (SELECT column_list
FROM table_name
ORDER BY sort_column)
WHERE ROWNUM <= N
ORDER BY ROWNUM ASC; -- 保證輸出順序 (可選)
-- 客戶表 customer(id, name) 有 11 筆資料 SELECT * FROM (SELECT * FROM customer ORDER BY name) WHERE ROWNUM <= 3 ORDER BY ROWNUM ASC; -- 結果: -- ID NAME -- 08 eighth -- 05 fifth -- 01 first
SELECT * FROM customer ORDER BY name OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;
優點:語法標準、可讀性高、優化器支援 FIRST_ROWS(n) 自動最佳化、可直接搭配綁定變數 OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY。
| 寫法 | 適用版本 | 解析/執行計畫 | 深分頁效能 | 建議場景 |
|---|---|---|---|---|
| ROWNUM 雙層巢狀 | 全版本 | 可能產生 COUNT STOPKEY 提前終止 | 差 (需掃描至 OFFSET) | 舊版本維護、簡單前幾頁 |
| OFFSET/FETCH | 12c+ | 優化器原生支援,可推導 FIRST_ROWS | 仍差 (標準限制) | 新專案標準寫法 |
| Keyset Pagination | 全版本 | WHERE id > :last_id ORDER BY id FETCH FIRST n | 極佳 (索引範圍掃描) | 大資料量、無限捲軸、API 分頁 |
-- 第一頁 SELECT * FROM customer ORDER BY customer_id FETCH FIRST 10 ROWS ONLY; -- 記下最後一筆 customer_id = 100 -- 後續頁 SELECT * FROM customer WHERE customer_id > 100 ORDER BY customer_id FETCH FIRST 10 ROWS ONLY;
前提:排序欄位唯一且有索引 (主鍵最佳)。