查詢結果常需顯示流水號 (1,2,3...)。雖前端處理最簡單,但有時需在 SQL 層完成。本文比較兩種純 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
ORDER BY au_lname, au_fname -- 可指定排序
SELECT * FROM #tmp
DROP TABLE #tmp
優點:
IDENTITY 僅支援 SELECT INTO。
SELECT
ROW_NUMBER() OVER (ORDER BY au_lname, au_fname) AS Rank,
au_lname, au_fname
FROM authors
| 環境 | 推薦方案 |
|---|---|
| SQL Server 2000 / 旧版本 | 方案二 (IDENTITY + 暫存表) |
| SQL Server 2005+ / 現代資料庫 | ROW_NUMBER() OVER () |
| 極小資料量 (< 1000 列)、臨時查詢 | 方案一 (COUNT(*)) 可接受 |
| 前端程式語言處理 (C#, Java, PHP, JS) | **最推薦**:前端迴圈產生,零資料庫負擔 |