資料表 ScoreInfo,主鍵 SID,假設每頁 5 筆,取第 3 頁(SID 11-15)。

SELECT TOP 5 * FROM ScoreInfo WHERE SID NOT IN (SELECT TOP 10 SID FROM ScoreInfo ORDER BY SID) ORDER BY SID

缺點: 掃描兩次全表,NOT IN 含 NULL 時邏輯陷阱,大數據量嚴重超時。
SELECT TOP 5 * FROM ScoreInfo WHERE SID > (SELECT MAX(t.SID) FROM (SELECT TOP 10 SID FROM ScoreInfo ORDER BY SID) t) ORDER BY SID

缺點: 仍需子查詢排序取 Top N,效能隨頁碼增大線性惡化(深分頁問題)。
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY SID) AS RowNum
FROM ScoreInfo
) t
WHERE t.RowNum BETWEEN 11 AND 15 -- (頁碼-1)*頁大小+1 至 頁碼*頁大小

優點: 單次掃描賦予行號,無深分頁效能退化,SQL 2005+ 通用。
SELECT * FROM ScoreInfo ORDER BY SID OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY -- 跳過前 10 筆,取 5 筆

優點: 語法簡潔標準、優化器支援最佳、無子查詢開銷、可讀性最高。
| 寫法 | 適用版本 | 深分頁效能 | 碼可讀性 | 推薦指數 |
|---|---|---|---|---|
| NOT IN | 所有 | ❌ 極差 | ⭐⭐ | ⭐ |
| MAX(ID) | 所有 | ❌ 差 | ⭐⭐⭐ | ⭐⭐ |
| ROW_NUMBER | 2005+ | ✅ 良好 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| OFFSET-FETCH | 2012+ | ✅ 最佳 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
WHERE SID > @LastSeenID ORDER BY SID OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY,利用索引 Seek 直接定位,極大數據集翻頁無延遲。ROW_NUMBER(),勿用 NOT IN/MAX(ID)。