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

T-SQL SOUNDEX/差异以查找重复行

  •  3
  • simon831  · 技术社区  · 15 年前

    我有一个传统的数据库: 名字、姓氏、地址1、地址2、地址3、地址4、邮政编码 数据分散在不同的列之间,没有一致性,例如实际的zipcode可能在任何列中,并且有大量的拼写错误。

    有没有一种方法可以在SP中使用soundex/difference之类的东西来循环遍历所有内容并返回可能重复的有序列表? [不需要太快]

    2 回复  |  直到 15 年前
        1
  •  3
  •   HLGEM    15 年前

    如果您使用的是SQL Server 2005或更高版本,则可以在SSIS中使用模糊匹配来执行此任务。我发现这样做的效果比寻找soundex匹配项或编写自己的SQL scode查找近匹配项要好得多。

        2
  •  1
  •   boydc7    15 年前

    如果你只是想 可能的 重复的 checksum / binary_checksum 函数会给您一个很好的指示,尽管它只是一个32位的散列,所以根据数据集的大小,您最终可能会得到一些误报。checksum()不区分大小写,binary_checksum()区分大小写。这将为表中的每个记录提供32位散列值:

    select   checksum(*), binary_checksum(*)
    from     tableName;
    

    您可以对具有不同ID值(或不同名称值等)的记录的重复哈希进行自联接匹配,这取决于使给定记录在数据集中唯一的原因。看起来像这样:

    select   id, checksum(*)
    from     tableName a
    join     tableName b
    on       a.checksum(*) = b.checksum(*)
    and      a.id <> b.id;
    

    这两个函数可以获取参数的任何列列表并提供哈希,因此如果您只想哈希fname、lname、address等列,而不是整个记录,则校验和函数如下所示:

    checksum(a.fName, a.lName, a.address, ...)
    

    而不是像上面例子中那样的校验和(*)。