如何删除id在不同列上的重复项?

时间:2017-04-27 07:16:05

标签: sql-server sql-server-2008

删除重复项时遇到问题。这里重复的是我在下面的例子。

EmployeeID  IDnr1   IDnr2
123456      111111  222222
123456      222222  111111

我想删除其中一行。谁没关系。 我有几千个这样的重复行 提前致谢

2 个答案:

答案 0 :(得分:1)

CASE子句中使用GROUP BY表达式。

<强>查询

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

答案 1 :(得分:1)

一种方法是使用带有row_number()的cte。

创建并填充样本表(在将来的问题中保存此步骤)

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)

cte - 注意使用case来获得最小值:

;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

这样可以确保不会在表格中插入新的重复项。