删除重复项时遇到问题。这里重复的是我在下面的例子。
EmployeeID IDnr1 IDnr2
123456 111111 222222
123456 222222 111111
我想删除其中一行。谁没关系。 我有几千个这样的重复行 提前致谢
答案 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
但是,删除重复项只是工作的一部分。您希望确保不能向表中插入新的重复项。为此,您需要向表中添加检查约束,但首先,更新表。 此步骤将确保您可以添加检查约束:
UPDATE TableName
SET Idnr1 = Idnr2,
Idnr2 = Idnr1
WHERE Idnr1 >= Idnr2
然后,添加检查约束:
ALTER TABLE TableName
ADD CONSTRAINT CK_TableNamePreventDups CHECK(Idnr1 < Idnr2)
GO
这样可以确保不会在表格中插入新的重复项。