首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 查詢結果加入自動遞增序號的 5 種方法:從子查詢到 ROW_NUMBER()

     編輯:MySQL 資料庫相關知識

場景:原表無身分欄,需在 SELECT 結果中動態產生流水號

方法一:相關子查詢(通用、效能最差)

SELECT
    序號 = (SELECT COUNT(客戶編號) FROM 客戶 AS L
            WHERE L.客戶編號 <= C.客戶編號),
    客戶編號, 公司名稱
FROM 客戶 AS C
ORDER BY 1;

每行掃描一次表,O(N²),僅適合極小資料集。

方法二:RANK() OVER()(SQL 2005+)

SELECT
    RANK() OVER (ORDER BY 客戶編號 DESC) AS 序號,
    客戶編號, 公司名稱
FROM 客戶;

相同值同序號、下一序號跳號(1,1,3)。

方法三:自我 JOIN + GROUP BY

SELECT
    序號 = COUNT(*),
    L.客戶編號, L.公司名稱
FROM 客戶 AS L, 客戶 AS C
WHERE L.客戶編號 >= C.客戶編號
GROUP BY L.客戶編號, L.公司名稱
ORDER BY 序號;

同樣 O(N²),不推薦生產環境。

方法四:暫存表 + IDENTITY(SQL 2000 經典)

SELECT
    序號 = IDENTITY(INT, 1, 1),
    管道, 程式語言, 講師, 資歷
INTO #Tmp
FROM 問卷調查;

SELECT * FROM #Tmp;
DROP TABLE #Tmp;

需建立暫存表、寫入再讀取,有 TempDB 壓力。

方法五:ROW_NUMBER() + CTE(SQL 2005+ 推薦)

WITH 排序結果 AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY 客戶編號 DESC) AS 序號,
        客戶編號, 公司名稱
    FROM 客戶
)
SELECT * FROM 排序結果
WHERE 序號 BETWEEN 2 AND 4;  -- 分頁取第 2-4 筆

✅ 單掃描、✅ 無 TempDB 寫入、✅ 支援分頁、✅ 可搭配 PARTITION BY 分組編號。

效能與適用性總結

方法版本需求效能特性
子查詢 COUNTAll★☆☆☆☆相同值連續編號
RANK()2005+★★★★☆相同值同序號、跳號
自我 JOINAll★☆☆☆☆教學示範用
IDENTITY + #Temp2000+★★★☆☆舊版相容、TempDB 壓力
ROW_NUMBER() + CTE2005+★★★★★標準、分頁、分組、無副作用

結論:SQL Server 2005 以上環境,**首選 ROW_NUMBER() OVER() + CTE**。

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