假設每頁 10 筆,查詢第 @Page 頁,條件 username = 'user'。
SELECT TOP 10 * FROM (
SELECT TOP (@Page * 10) ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
FROM Guest WHERE username = 'user'
) AS T
WHERE RowNum > ((@Page - 1) * 10)
特點:內層只取前 N 頁資料,外層再過濾。早期 SQL Server 2005 常見寫法,但內層 TOP 可能導致排序運算子處理過多列。
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
FROM Guest WHERE username = 'user'
) AS T
WHERE RowNum BETWEEN 31 AND 60 -- 第 4 頁(每頁 10 筆)
特點:語法簡潔,執行計劃穩定,適合大多數場景。
WITH T AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
FROM Guest WHERE username = 'user'
)
SELECT * FROM T
WHERE RowNum BETWEEN 31 AND 60
特點:可讀性最佳,支援遞歸查詢,效能與模式 2 相同(優化器會展開為相同計劃)。
ORDER BY 欄位有索引(最佳為覆蓋索引)。OVER() 中使用複雜運算式,影響索引使用。OFFSET ... FETCH 標準語法,更簡潔。