2017-04-27 57 views
0

我在移除重複項時遇到問題。這裏重複的是我在下面舉一個例子。
如何刪除id在不同列上的重複項?

EmployeeID IDnr1 IDnr2 
123456  111111 222222 
123456  222222 111111 

我想刪除其中的一行。誰不重要。 我有幾千這樣的重複行。
在此先感謝

+0

最終沒有重複..它是在不同的列,並有不同的值 –

回答

1

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; 

Find a demo here

+0

完美。這很好。謝謝:D – torbol

1

一種方式來做到這一點是使用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 

See a live demo on rextester.

但是,刪除重複只是工作的一部分。你想確保沒有新的重複項可以插入到表中。要做到這一點,你需要添加一個檢查約束到你的表,但首先,更新表。 這一步將確保您可以添加檢查約束:

UPDATE TableName 
SET Idnr1 = Idnr2, 
    Idnr2 = Idnr1 
WHERE Idnr1 >= Idnr2 

然後,添加檢查約束:

ALTER TABLE TableName 
ADD CONSTRAINT CK_TableNamePreventDups CHECK(Idnr1 < Idnr2) 
GO 

這將確保沒有新的副本可以被插入到你的表。