代码之家  ›  专栏  ›  技术社区  ›  Jim

当两个表之间没有公共键时,是否可以比较两个表?

  •  2
  • Jim  · 技术社区  · 17 年前

    我有两个表要比较是否有重复项。这些表只是基本的公司信息字段,如名称、城市、州等。我能看到的唯一可能通用的字段是名称列,但名称并不完全准确。有没有一种方法可以使用like语句对两者进行比较?我也愿意接受任何人可能提出的任何其他建议。

    谢谢。

    4 回复  |  直到 17 年前
        1
  •  3
  •   D'Arcy Rittich    17 年前

    我会尝试用 Double Metaphone 算法,这是一个更复杂的Soundex类型的算法。

    这里是一个 MySQL implementation .

        2
  •  2
  •   APC    17 年前

    有些公司通过销售数据清洗产品来维持良好的生活,这些产品进行了这种模糊匹配。所以你不可能用一个简单的(甚至是一个非常复杂的)来解决这个问题。 LIKE 语句。

    你需要的是能够比较两个字符串并返回相似性分数的东西,100%的分数意味着相同。有点像 Jaro-Winkler algorithm . 替代算法包括 Metaphone (或双隐喻)和 Soundex() . SouthOutlook() 是最粗糙的解决方案。

    另一种解决方案是使用专家文本索引。这种方法最酷的一点是,我们可以指定一个同义词库来指定同义词,消除不相关的差异(inc=incorporated,co=company等)。

    Oracle和SQL Server都包含这样一个工具,但我不熟悉MySQL。

        3
  •  1
  •   Alterlife    17 年前

    SOUNDEX() 会在一定程度上帮助你。但这远非完美。

    即使字符串1和字符串2的拼写不同,Soundex(String1)也应等于Soundex(String2)。但正如我所说,这远非完美。

    据我所知,目前还没有一种算法能很好地做到这一点。

        4
  •  0
  •   j_random_hacker    17 年前

    嗯,没有100%保证正确的方法,没有。但是你可以通过将所有“杂乱”的列转换为更多的列来取得一些进展。 标准形 例如,通过将所有内容都大写,修剪前导空格和尾随空格,并确保一行中最多出现1个空格。还有一些事情,比如把“史密斯,约翰”的名字改成“约翰史密斯”(反之亦然——只需选择一个表格,然后跟着它走)。当然你应该 副本 在记录中,不要更改原件。您可以尝试丢弃进一步的信息(例如,“John Smith”->“J Smith”)——您会发现这会将误报的平衡改变为误报。

    我可能会采用为每对记录分配相似性得分的方法。例如,如果规范化的名称、地址和电子邮件地址完全一致,则分配1000分;否则,减去(某些倍数) Levenshtein distance 从1000开始使用。你需要想出你自己的计分方案,在不同类型的差异之间游玩并决定其相对重要性(例如,电话号码中的不同数字可能比两个人名字中的1个字符的差异更重要)。然后,通过实验,您将能够建立一个分数,在该分数之上,您可以自信地将“重复”状态分配给一对记录,在该分数之上,需要手动检查;在下面 那个 得分,我们可以自信地说这两个记录是 不 复制品。

    这里的现实目标是 减少 手动删除副本所需的工作量。 除非所有的复制都是通过自动复制过程生成的,否则您不可能完全消除它。

    推荐文章