繁体   English   中英

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

[英]SQL for Fuzzy Match Deduplication

表A的记录中包含重复的实体,字符串的变化很小。 没有可以唯一标识实体的唯一密钥。 字段“ ID”标识表中的记录,而不标识实体本身。

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

通过使用模糊匹配软件,对表A进行自身的模糊匹配,以检测重复的记录。 这就是创建表B的方式,表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中。我在询问如何执行重复项的删除(并为每个已识别的重复项记录保留一条记录)组),则根据已经确定的重复记录对(每个相同实体有多个重复记录对)。

我看到的主要问题是您的模糊匹配表包含重复的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM