【问题标题】:Join a partially matched table加入部分匹配的表
【发布时间】:2021-10-14 22:08:57
【问题描述】:

早上好,

我想连接两个表,但在某些情况下“名称”列不完全匹配。

例如,T1 中的名称是“Acosta, Joan”,但 T2 中的名称是“Perez Acosta, Joan”或“Acosta, Manuel Joan”。

我想加入这些表的主要原因是更新 T1 中的字段。

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
  • 可能可以使用SOUNDEX之类的东西,但真正的问题是数据;从数据的角度来看,'Acosta, Joan''Perez Acosta, Joan'同名。真的,名字不是一个很好的唯一标识符(从认识其他人的人那里得到这个,他们不仅与我认识的其他人共享名字,而且他们的 DoB 我们住在同一条街上) .
  • 如果你想一致地关联表,你应该首先解决修复关系的任务。否则,您基于模糊匹配执行的任何更新最终都可能对数据造成更大的破坏。

标签: sql sql-server join left-join inner-join


【解决方案1】:

如果您需要检查具有不同(但相似)值的字段,则没有标准的加入方式。

您可以定义一个函数,将两个值作为参数进行比较并返回两个字段之间的距离。然后您可以在连接中使用该函数,例如

   SELECT *
   FROM T1
   INNER JOIN T2 ON distance(T1.NAME, T2.NAME) < MAX_DISTANCE_ALLOWED

如何对置信度函数进行编码是范围的方法,但您可以例如使用Levensthein distance 的变体:

在信息论、语言学和计算机科学中,Levenshtein 距离是一种用于衡量两个序列之间差异的字符串度量。通俗地说,两个单词之间的 Levenshtein 距离是将一个单词更改为另一个单词所需的最小单字符编辑(插入、删除或替换)次数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2017-05-02
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多