SQL 用于模糊匹配去重
SQL for Fuzzy Match Deduplication
Table A 的记录包含带有细微字符串变化的重复实体。没有可以唯一标识实体的唯一键。字段 "ID" 标识 table 内的记录,但不是实体本身。
TABLE A
--------------
ID;SomeString
1;something1
2;something2
3;something3
通过使用模糊匹配软件,table A 与自身进行模糊匹配,以检测重复记录。这就是查找 Table B 的创建方式,它有两列:ID1 和 ID2,表示来自 Table A.
的匹配记录的 ID
TABLE B
---------
ID1;ID2
1;2
1;3
2;1
2;3
3;1
3;2
重复数据删除的结果是从tableA中删除记录2和3,这样只保留第一条记录。
TABLE A
--------------
ID;SomeString
1;something1
有没有办法通过使用 Table B 作为已识别重复记录的模糊匹配查找 table 来执行 Table A 到 SQL 的模糊匹配去重?
澄清一下,我不是在寻求一种方法来进行模糊匹配或识别重复项,它已经完成并且结果在 table B 中。我在问如何执行删除重复项(并保留一条记录每个已识别的重复记录组),根据已识别的重复记录对(每个同一实体的多个重复记录对)。
我看到的主要问题是您的 table 模糊匹配包含 ID 顺序颠倒的重复对。这意味着你有行说 2 是 1 的副本,1 是 2 的副本。如果你删除了所有基于 Table B 的 ID2 列的行,你最终会删除所有Table A 中的行。
您可以使用 select 语句解决此问题,该语句重新排列列,使较小的 ID 始终排在第一位。这样,前面的例子“2 是 1 的副本,1 是 2 的副本”就变成了“2 是 1 的副本”的重复。那时,您可以 select 不同的值来获取要从 Table 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)
Table A 的记录包含带有细微字符串变化的重复实体。没有可以唯一标识实体的唯一键。字段 "ID" 标识 table 内的记录,但不是实体本身。
TABLE A
--------------
ID;SomeString
1;something1
2;something2
3;something3
通过使用模糊匹配软件,table A 与自身进行模糊匹配,以检测重复记录。这就是查找 Table B 的创建方式,它有两列:ID1 和 ID2,表示来自 Table A.
的匹配记录的 ID TABLE B
---------
ID1;ID2
1;2
1;3
2;1
2;3
3;1
3;2
重复数据删除的结果是从tableA中删除记录2和3,这样只保留第一条记录。
TABLE A
--------------
ID;SomeString
1;something1
有没有办法通过使用 Table B 作为已识别重复记录的模糊匹配查找 table 来执行 Table A 到 SQL 的模糊匹配去重? 澄清一下,我不是在寻求一种方法来进行模糊匹配或识别重复项,它已经完成并且结果在 table B 中。我在问如何执行删除重复项(并保留一条记录每个已识别的重复记录组),根据已识别的重复记录对(每个同一实体的多个重复记录对)。
我看到的主要问题是您的 table 模糊匹配包含 ID 顺序颠倒的重复对。这意味着你有行说 2 是 1 的副本,1 是 2 的副本。如果你删除了所有基于 Table B 的 ID2 列的行,你最终会删除所有Table A 中的行。
您可以使用 select 语句解决此问题,该语句重新排列列,使较小的 ID 始终排在第一位。这样,前面的例子“2 是 1 的副本,1 是 2 的副本”就变成了“2 是 1 的副本”的重复。那时,您可以 select 不同的值来获取要从 Table 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)