【问题标题】:SQL: Search for duplicate rows even though they might not be exact duplicatesSQL:搜索重复的行,即使它们可能不是完全重复的
【发布时间】:2016-02-29 19:01:42
【问题描述】:

我正在尝试在数据库中搜索一些重复记录,这些重复记录是由最终用户输入的。由于它们是由最终用户(可能是不同的人)输入的,因此记录略有不同。我唯一可以搜索的是公司名称,正如您可能已经猜到的那样,它的措辞可能会有所不同。示例:

Id    Code    Name
1     A001    Company A LTD
2     A002    Company A Limited
3     A003    Co. A LTD

所有 3 条记录都是针对同一家公司的,只是不同的人可能输入了这些记录,因此他们对公司名称的措辞不同。所以我想做的是从支持的角度更容易,我想为有重复的公司找​​到这些记录,然后删除它,但你可以想象它很难搜索,因为名称可能不同。

我正在考虑使用 Like 语句获取公司名称的第一个字母和第二个单词。

Where Name Like 'C%A%'

但肯定有更好的方法来做到这一点。

【问题讨论】:

  • 现在不在我的机器上 - 看看模糊匹配
  • 专门找SOUNDEX和DIFFERENCE()
  • 我们多年来一直遇到这些问题。我们甚至在用户输入客户姓名时向他们推荐姓名 - 他们仍会输入重复项。 SoundEx 不能很好地处理“Ltd”和“Limited”等差异。唯一的办法就是教育用户!
  • @navigator 虽然这是真的,但教育用户需要时间,运营商显然现在需要做点什么。您可以创建一个查找表或类似的东西来处理已知的缩写,然后将 soundex 应用于它。

标签: sql sql-server


【解决方案1】:

看看SOUNDEX()DIFFERENCE()

Using SOUNDEX and DIFFERENCE to Standardize Data in SQL Server

SOUNDEX 将字母数字字符串转换为四字符代码 是基于说话时弦乐的声音。第一个字符 代码是character_expression的第一个字符,转换为 大写。代码的第二个到第四个字符是 表示表达式中字母的数字。字母 A, E、I、O、U、H、W 和 Y 将被忽略,除非它们是第一个字母 的字符串。如有必要,在末尾添加零以生成 四字代码。有关 SOUNDEX 代码的更多信息,请参阅 Soundex 索引系统。

可以比较来自不同字符串的 SOUNDEX 代码,看看如何 发音时类似于弦乐的声音。差异函数 对两个字符串执行 SOUNDEX,并返回一个整数 表示这些字符串的 SOUNDEX 代码有多相似。

SOUNDEX 对排序规则敏感。字符串函数可以嵌套。

取自MSDN - SOUNDEX (Transact-SQL)

【讨论】:

  • 感谢您的帮助。这似乎适用于大多数情况,但有一些会返回超过 2 个结果或只返回任何内容。因为这是客户最有可能要求我们做的事情,所以这种方式很好,因为我们可以根据需要修改代码。我希望它可以为我们完成,这样他们就可以使用我编写的用于调用存储过程的程序自己完成它,但从所有答案看来,实际上让它变得完美可能太耗时了。
【解决方案2】:

这实际上不是一个 SQL 问题。您正在寻找要应用的规则,而是一种算法。

从您的示例中,您可以使用同义词列表('Company' = 'Co.'、'Limited' = 'LTD')。然后您将所有“公司”替换为“公司”,将所有“有限”替换为“LTD”等。然后您将比较结果字符串,可能不区分大小写。

但这仍然找不到“A Limited”或“A”。所以也许更好地删除所有不是实际名称(在您的示例中为 A)?但这可能会导致误报。

然后可能会出现拼写错误“Sdidas”而不是“Adidas”,因为 S 在键盘上的 A 旁边或“didas”,因为 A 键按得不够用力:-(

应用算法的软硬程度取决于您。一条规则可能会让您获得太多没有的“重复项”,而另一条规则可能不是所有实际存在的重复项。

下定决心要考虑复制的内容。对此可能没有“完美”的解决方案。

【讨论】:

    【解决方案3】:

    我会使用Full Text Search。它可以处理诸如“ltd”之类的事情。和“有限”或“合作”。和“公司”通过可配置的词库,但最终,这仍然是一项手动工作,逐个检查记录,检查排名靠前的匹配并决定保留哪一个。

    【讨论】:

      【解决方案4】:

      由于仅仅通过技术比较并不能真正解决这个问题,因此您可能想走一条完全不同的路线。

      您的数据库中的所有公司都可能由某个企业 ID 标识。一个示例是全球位置编号 GLN,或者可能是美国注册编号(或它们所在的任何位置)。所以你可以在表格中引入这个数字,然后让维护数据的人(即进入公司的人)添加这些数字。然后最后简单地搜索重复的 ID。

      (您的数据库显然基于技术 ID。在具有自然键的数据库中,您首先会寻找能够唯一标识公司的东西,例如 GLN,以便构建表。所以使用自然键在设置数据库时,密钥通常需要更多的工作,但稍后会得到回报,就像在您的示例中一样,您根本无法获得任何重复项:-)

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 2020-01-08
        • 2020-07-27
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2019-01-19
        • 2020-10-07
        相关资源
        最近更新 更多