用于模糊匹配重复数据删除的 SQL



表 A 的记录具有重复的实体,具有细微的字符串变化。没有唯一标识实体的唯一键。字段"ID"标识表内的记录,但不标识实体本身。

TABLE A
--------------
ID;SomeString
1;something1
2;something2
3;something3

通过使用模糊匹配软件,表A与自身进行模糊匹配,以检测重复记录。这就是查找表 B 的创建方式,它有两列:ID1 和 ID2,表示表 A 中匹配记录的 ID。

TABLE B
---------
ID1;ID2
1;2
1;3
2;1
2;3
3;1
3;2

重复数据删除的结果是从表 A 中删除记录 2 和 3,以便只保留第一条记录。

TABLE A
--------------
ID;SomeString
1;something1

有没有办法通过使用表 B 作为已识别重复记录的模糊匹配查找表来执行表 A 到 SQL 的这种模糊匹配重复数据删除? 澄清一下,我并不是要求一种方法来进行模糊匹配或识别重复项,它已经完成并且结果在表 B 中。我想知道如何根据已经识别的重复记录对(每个相同实体多个重复记录对(执行重复记录的删除(并为每个已识别的重复记录组保留一条记录(。

我看到的主要问题是您的模糊匹配表包含重复的对,ID 的顺序颠倒了。这意味着您有行可以说 2 是 1 的副本,1 是 2 的副本。如果您根据表 B 的 ID2 列删除了所有行,则最终只会删除表 A 中的所有行。

您可以使用 select 语句来解决此问题,该语句重新排列列,以便较小的 ID 始终排在第一位。这样,前面的例子"2 是 1 的副本,1 是 2 的副本"就变成了"2 是 1 的副本"的重复。此时,您可以选择不同的值来获取要从表 A 中删除的 ID 列表。

根据您的示例数据,此查询删除了正确的值:

WITH Duplicates (ID) AS
(
SELECT DISTINCT 
CASE
WHEN ID1 > ID2 THEN ID1
WHEN ID2 > ID1 THEN ID2
END AS Duplicate
FROM Table_B
)
DELETE
FROM Table_A
WHERE ID IN (SELECT * FROM Duplicates)

最新更新