常見需求:查詢結果需顯示行號,但不想在應用層處理。本文比較三種 T-SQL 方案的原理、效能、優缺點,給出選型建議。
USE pubs
SELECT COUNT(*) AS Rank, a1.au_lname, a1.au_fname
FROM authors a1, authors a2
WHERE a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY Rank
USE pubs
SELECT IDENTITY(INT, 1, 1) AS Rank, au_lname, au_fname
INTO #tmp
FROM authors
SELECT * FROM #tmp
DROP TABLE #tmp
SELECT INTO 配合 IDENTITY 函數自動產生流水號。SELECT ROW_NUMBER() OVER (ORDER BY au_lname, au_fname) AS Rank,
au_lname, au_fname
FROM authors
PARTITION BY 分組編號、效能最佳、無暫存表開銷。| 方案 | 語句數 | 複雜度 | 並列排名 | 適用版本 | 建議場景 |
|---|---|---|---|---|---|
| 自聯結計數 | 1 | O(N²) | 有缺號 | 所有版本 | 極小資料集、臨時查詢 |
| IDENTITY + #Temp | 3 | O(N) | 無 | 所有版本 | 舊版本無視窗函數時 |
| ROW_NUMBER() | 1 | O(N) | 可控 | 2005+ | 生產環境首選 |
ROW_NUMBER(),語法簡潔、效能最優。IDENTITY + #Temp 方案。