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 

这将确保没有新的副本可以被插入到你的表。