我在移除重複項時遇到問題。這裏重複的是我在下面舉一個例子。
如何刪除id在不同列上的重複項?
EmployeeID IDnr1 IDnr2
123456 111111 222222
123456 222222 111111
我想刪除其中的一行。誰不重要。 我有幾千這樣的重複行。
在此先感謝
我在移除重複項時遇到問題。這裏重複的是我在下面舉一個例子。
如何刪除id在不同列上的重複項?
EmployeeID IDnr1 IDnr2
123456 111111 222222
123456 222222 111111
我想刪除其中的一行。誰不重要。 我有幾千這樣的重複行。
在此先感謝
在GROUP BY
子句中使用CASE
表達式。
查詢
select [EmployeeID], min([IDnr1]) [IDnr1], max([IDnr2]) [IDnr2]
from [your_table_name]
group by [EmployeeID],
case when [IDnr1] > [IDnr2] then [IDnr1] else [IDnr2] end,
case when [IDnr1] > [IDnr2] then [IDnr2] else [IDnr1] end;
完美。這很好。謝謝:D – torbol
一種方式來做到這一點是使用CTE與row_number()
。
(保存我們請在你未來的問題,這一步)創建和填充示例表
DECLARE @T AS TABLE
(
EmployeeID int,
IDnr1 int,
IDnr2 int
)
INSERT INTO @T VALUES
(123456, 111111, 222222),
(123456, 222222, 111111),
(123456, 111112, 222222),
(123457, 222222, 111111)
熱膨脹係數 - 注意使用情況下獲得的最小值:
;WITH CTE AS
(
SELECT EmployeeID,
ROW_NUMBER() OVER(PARTITION BY EmployeeID,
CASE WHEN IDnr1 < IDnr2 THEN IDnr1 ELSE IDnr2 END,
CASE WHEN IDnr1 < IDnr2 THEN IDnr2 ELSE IDnr1 END
ORDER BY (SELECT NULL)) rn
FROM @T
)
刪除聲明:
DELETE
FROM CTE
WHERE rn > 1
但是,刪除重複只是工作的一部分。你想確保沒有新的重複項可以插入到表中。要做到這一點,你需要添加一個檢查約束到你的表,但首先,更新表。 這一步將確保您可以添加檢查約束:
UPDATE TableName
SET Idnr1 = Idnr2,
Idnr2 = Idnr1
WHERE Idnr1 >= Idnr2
然後,添加檢查約束:
ALTER TABLE TableName
ADD CONSTRAINT CK_TableNamePreventDups CHECK(Idnr1 < Idnr2)
GO
這將確保沒有新的副本可以被插入到你的表。
最終沒有重複..它是在不同的列,並有不同的值 –