如果想要刪除重複資料,可以用 ROW_NUMBER() 來為重複資料分組排序,並將每一組不是第一筆的重複資料移除掉。
程式碼
WITH TmpOrderdTable
AS
(
SELECT
GroupID = ROW_NUMBER() OVER (PARTITION BY 欄位1, 欄位2, 欄位3 ORDER BY 主索引鍵)
FROM
[dbo].[MyTable]
)
DELETE FROM TmpOrderdTable WHERE GroupID > 1
NOTE: 這段程式碼有記錄在保哥 如何刪除 SQL Server 資料庫中重複的資料 (兩種不同解法) - The Will Will Web 文章裡,以下是自己理解的說明。
- ORDER BY 填入數值類型的主索引鍵 (例如:int),例如 ID 欄位。
- 決定何謂重複資料: 若判斷重複資料的依據是看其中 3 個欄位,那就將這些欄位全部列入
PARTITION BY子句中。
原理
- 用
ROW_NUMBER()先幫每個 ID 分組並排序。 - 將分組結果存入 CTE。
- 只保留第一筆 (
GroupID = 1),其它 (GroupID > 1) 的視為重複 → 刪掉。
ROW_NUMBER() 視窗函數
- 它會根據
PARTITION BY(分組) 和ORDER BY(排序) 的規則,幫每一筆資料編號。 - 舉例:如果
MainTable裡有多筆相同的ID,那麼ROW_NUMBER()就會從 1 開始依序編號。
CTE (Common Table Expression)
- SQL 的一個暫時結果集 (像是暫時的表格)。我們用它來「標記哪些是重複資料」。
