SQL:搜索重复的行,即使它们可能不完全重复

时间:2016-02-29 10:25:56

标签: sql sql-server

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

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%'

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

4 个答案:

答案 0 :(得分:1)

查看SOUNDEX()DIFFERENCE()

Using SOUNDEX and DIFFERENCE to Standardize Data in SQL Server

  

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

     

可以比较来自不同字符串的SOUNDEX代码以了解具体方法   类似于说话时的弦乐声。 DIFFERENCE功能   对两个字符串执行SOUNDEX,并返回一个整数   表示SOUNDEX代码与这些字符串的相似程度。

     

SOUNDEX是整理敏感的。字符串函数可以嵌套。

取自MSDN - SOUNDEX (Transact-SQL)

答案 1 :(得分:0)

这实际上不是SQL问题。您正在寻找规则来应用算法。

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

但是,仍然无法找到A Limited'或者' A'。所以也许最好删除所有不是实际名称(在你的例子中为A)?但这可能会导致误报。

然后可能会出现错别字' Sdidas'阿迪达斯'阿迪达斯'因为S在键盘上的A旁边,或者' didas'因为A键的压力不够大: - (

取决于您应用的算法有多硬或多软。一条规则可能会让你太多"重复"没有,另一个不是所有实际存在的重复。

明白你真正想要重复的内容。可能没有#34;完美"解决方案。

答案 2 :(得分:0)

我会使用Full Text Search。它可以照顾像“有限公司”这样的东西。和“有限”或“共同”。和“公司”通过可配置的词库,但最终,这仍然是一个逐个记录的手动工作,检查排名最高的匹配,并决定保留哪一个。

答案 3 :(得分:0)

由于仅通过技术比较无法解决这个问题,您可能想要采用完全不同的路线。

可能是您的数据库中的所有公司都可以通过某个业务ID识别。一个例子是全球位置号GLN,或者可能是美国注册号(或者它们位于何处)。因此,您可以在tabe中引入此数字,然后要求维护数据的人员(即进入公司的人员)添加这些数字。然后最后只搜索重复的ID。

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