表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作为已识别重复记录的模糊匹配查找表,通过SQL执行表A的这种模糊匹配重复数据删除? 为了澄清,我不是在要求进行模糊匹配或识别重复项的方法,它已经完成并且结果在表B中。我在询问如何执行重复项的删除(并为每个已识别的重复项记录保留一条记录)组),根据已经确定的重复记录对(每个相同实体有多个重复记录对)。
答案 0 :(得分:1)
我看到的主要问题是您的模糊匹配表包含重复的ID顺序相反的重复对。这意味着您要说两行都是1的重复,而1则是2的重复。如果您根据表B的ID2列删除了所有行,则最终将删除表中的所有行。
您可以使用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)