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

时间:2018-09-06 20:22:44

标签: sql duplicates fuzzy-comparison

表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中。我在询问如何执行重复项的删除(并为每个已识别的重复项记录保留一条记录)组),根据已经确定的重复记录对(每个相同实体有多个重复记录对)。

1 个答案:

答案 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)