我在移除重复项时遇到问题。这里重复的是我在下面举一个例子。
如何删除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
这将确保没有新的副本可以被插入到你的表。
最终没有重复..它是在不同的列,并有不同的值 –