我正在尝试在数据库中搜索一些重复记录,这些副本是由最终用户输入的。由于它们是由最终用户(可能是不同的人)输入的,因此记录略有不同。我唯一可以搜索的就是公司名称,正如您可能已经猜到的那样,可能会有不同的措辞。例如:
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%'
但肯定有更好的方法可以做到这一点。
答案 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是整理敏感的。字符串函数可以嵌套。
答案 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,以便构建表。所以使用自然在设置数据库时,键通常更有效,但稍后会得到回报,例如在您的示例中,您根本无法获得任何重复项: - )