查詢結果集需動態添加行號,支援分頁、報表排序、快取過濾。
SET NOCOUNT ON;
SELECT IDENTITY(INT, 1, 1) AS RowOrder,
au_lname, au_fname
INTO #tmp
FROM authors;
SELECT * FROM #tmp;
DROP TABLE #tmp;
SELECT
RANK = COUNT(*),
a1.au_lname,
a1.au_fname
FROM authors a1
INNER JOIN authors a2
ON a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY COUNT(*);
RANK au_lname au_fname
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
...
SELECT
ROW_NUMBER() OVER (ORDER BY au_lname, au_fname) AS RowNum,
au_lname, au_fname
FROM authors;
| 技法 | 耗時 | CPU | 邏輯讀取 | 適用版本 |
|---|---|---|---|---|
| 臨時表 + IDENTITY | ~120ms | 低 | ~1,200 | 所有版本 |
| 自聯接 | ~45,000ms | 極高 | ~500,000 | 所有版本 |
| ROW_NUMBER() | ~180ms | 低 | ~1,500 | 2005+ |
DECLARE @PageIndex INT = 2, @PageSize INT = 20;
WITH Numbered AS (
SELECT
ROW_NUMBER() OVER (ORDER BY OrderDate DESC) AS RowNum,
OrderID, CustomerID, OrderDate, TotalAmount
FROM Orders
)
SELECT OrderID, CustomerID, OrderDate, TotalAmount
FROM Numbered
WHERE RowNum > @PageIndex * @PageSize
AND RowNum <= (@PageIndex + 1) * @PageSize;
自聯接技法僅具歷史參考價值,現代開發應全面採用視窗函數。臨時表適合中繼結果物理化場景。