首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

查詢結果加入流水號:自聯結法 vs IDENTITY 暫存表法

     編輯:關於SqlServer

方法一:自聯結計數 (純單一陳述式,但效能差)

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

缺點:O(N^2) 複雜度,相同值產生並列排名 (如 1,2,2,4 缺 3)。

方法二:IDENTITY 函數 + 暫存表 (推薦,效能好)

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

優點:線性掃描、無並列排名問題、可直接套用分頁 (WHERE Rank BETWEEN 11 AND 20)。

現代最佳寫法 (SQL 2005+)

SELECT ROW_NUMBER() OVER (ORDER BY au_lname, au_fname) AS Rank, au_lname, au_fname
FROM authors
  • 無需暫存表,單一陳述式,最佳化器支援最好。
  • 並列排名需求可用 RANK() / DENSE_RANK()。

建議

應用層 (前端/中間層) 加流水號最簡單且不佔資料庫資源;必須在 SQL 層時,優先用窗口函數,其次暫存表法,避免自聯結法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved