MySQL 支持 LIMIT m, n 直接偏移分頁,SQL Server 無原生 LIMIT 語法,需通過 TOP 組合實現等效功能。
-- 查詢第 7-9 條(跳過前 6 條,取 3 條)
SELECT TOP 3 id FROM tablename
WHERE id NOT IN (
SELECT TOP 6 id FROM tablename
);
通用模板:
SELECT TOP (n-m+1) id FROM tablename
WHERE id NOT IN (
SELECT TOP (m-1) id FROM tablename
);
缺點:NOT IN 遇 NULL 值失效,大偏移性能差(需掃描前 m 行)。
WITH Numbered AS (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM tablename
)
SELECT id FROM Numbered
WHERE rn BETWEEN 7 AND 9;
優勢:單次掃描、支持任意排序、性能穩定、語義清晰。
SELECT id FROM tablename
ORDER BY id
OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY;
優勢:語法最接近 LIMIT、優化器支持最好、可讀性最強。
| 方案 | 首頁(1-10) | 第1000頁 | 適用版本 |
|---|---|---|---|
| NOT IN | 快 | 極慢(全表掃描) | 2000+ |
| ROW_NUMBER | 中 | 中等 | 2005+ |
| OFFSET FETCH | 快 | 快(優化器深度優化) | 2012+ |
OFFSET FETCHROW_NUMBER() CTENOT IN 或 MAX(id) + TOP 近似分頁-- SQL 2012+
DECLARE @pageSize INT = 10, @offset INT = 20;
SELECT id FROM tablename
ORDER BY id
OFFSET @offset ROWS FETCH NEXT @pageSize ROWS ONLY;