使用SQL进行重复数据消除,请选择类似字段

使用SQL进行重复数据消除,请选择类似字段,sql,ms-access,Sql,Ms Access,我有一个access orders数据库,在一个名为“CustomerName”的字段中包含500多个客户名称 问题是,在输入订单时,我们的销售团队有时会键入不同的名称。(“ACME Inc”vs“ACME,Inc.”)所以现在我有几个客户实际上是同一家公司,但看起来不同 到目前为止,我已经编写了一个显示不同CustomerName值的查询,现在我需要一个基本上可以遍历所有这些值并向我显示名称相似之处的查询。也许如果名字的前十个字母匹配?或者,理想情况下,如果某个百分比的名称字母匹配 我不知道该

我有一个access orders数据库,在一个名为“CustomerName”的字段中包含500多个客户名称

问题是,在输入订单时,我们的销售团队有时会键入不同的名称。(“ACME Inc”vs“ACME,Inc.”)所以现在我有几个客户实际上是同一家公司,但看起来不同

到目前为止,我已经编写了一个显示不同CustomerName值的查询,现在我需要一个基本上可以遍历所有这些值并向我显示名称相似之处的查询。也许如果名字的前十个字母匹配?或者,理想情况下,如果某个百分比的名称字母匹配

我不知道该怎么做,非常感谢您的帮助


非常感谢

您可以拆分“”上的所有客户列,并在like子句中用%将它们重新连接起来 这将有助于找到ACME,Inc.,因为它将与ACME Inc%匹配


对于我来说,如果没有一个巨大的公司db和dupes,我很难测试这一点,但这个想法可能会有所帮助。

您可以在“”上拆分所有客户列,并在like子句中用%将它们重新连接起来 这将有助于找到ACME,Inc.,因为它将与ACME Inc%匹配


对于我来说,如果没有一个巨大的公司db和DUPS,我很难测试出这一点,但这个想法可能会有所帮助。

这取决于名称的不同。如果只是标点符号、大小写等,你可以去掉它们,并根据它们进行比较。如果比较复杂,例如“Inc,ACME”与“ACME Incorporated”,则必须编写一个函数来比较这两个字符串以对它们进行评分/排序

上面的链接指向另一个SO问题,该问题讨论了通常用于执行此操作的不同算法


上面的链接指向一个SO问题,该问题实现了VBA中的一种方法。这取决于名称的不同。如果只是标点符号、大小写等,你可以去掉它们,并根据它们进行比较。如果比较复杂,例如“Inc,ACME”与“ACME Incorporated”,则必须编写一个函数来比较这两个字符串以对它们进行评分/排序

上面的链接指向另一个SO问题,该问题讨论了通常用于执行此操作的不同算法


上面的链接指向一个SO问题,该问题实现了VBA中的一个方法。此语法适用于sql server。对于访问,逻辑将是相同的。我不确定语法。这是一个自动连接

select your fields
from yourtable t1 join yourtable t2
on left(t1.namefield, 10) = left(t1.namefield, 10)
and t1.namefield <> t2.namefield
选择您的字段
从表t1连接表t2
左侧(t1.namefield,10)=左侧(t1.namefield,10)
和t1.namefield t2.namefield
这将提供前10个字符相同的记录。然而,对于你所尝试的,我认为还不够彻底。我想你得检查一下你的数据库


也是,你可能想在修复过去之前考虑一下未来。换句话说,请采取措施防止再次发生,这样您只需执行一次此操作。

此语法适用于sql server。对于访问,逻辑将是相同的。我不确定语法。这是一个自动连接

select your fields
from yourtable t1 join yourtable t2
on left(t1.namefield, 10) = left(t1.namefield, 10)
and t1.namefield <> t2.namefield
选择您的字段
从表t1连接表t2
左侧(t1.namefield,10)=左侧(t1.namefield,10)
和t1.namefield t2.namefield
这将提供前10个字符相同的记录。然而,对于你所尝试的,我认为还不够彻底。我想你得检查一下你的数据库


也是,你可能想在修复过去之前考虑一下未来。换句话说,采取措施防止再次发生,这样你只需要做一次。

你只有500个客户名称。获取唯一的名称并将其放入Excel中。对它们进行排序,并为它们指定“真实”的客户名称

这应该不到一个小时

然后,将其上载到数据库中的新表中。新表将包含“真实客户名称”和“备选名称”。访问表时,执行联接以获取真实名称

这解决了眼前的问题

然后,您可以更新数据库中的数据以使用“真实”名称

并且,您可以将输入方法更改为以下方法之一:

  • 让销售人员从有效姓名列表中进行选择。或者,通过一个流程创建一个新客户
  • 如果客户名称不在“真实”列表中,则拒绝上传到系统中的数据。然后手动添加名称(如果是真正的新客户),并重新加载数据

你要处理的是500个名字,而不是500000个。人工操作是完全可行的。试图让SQL匹配相似的名称是很困难的。您将花费更多的时间来解决问题。

您只有500个客户名称。获取唯一的名称并将其放入Excel中。对它们进行排序,并为它们指定“真实”的客户名称

这应该不到一个小时

然后,将其上载到数据库中的新表中。新表将包含“真实客户名称”和“备选名称”。访问表时,执行联接以获取真实名称

这解决了眼前的问题

然后,您可以更新数据库中的数据以使用“真实”名称

并且,您可以将输入方法更改为以下方法之一:

  • 让销售人员从有效姓名列表中进行选择。或者,通过一个流程创建一个新客户
  • 如果客户名称不在“真实”列表中,则拒绝上传到系统中的数据。然后手动添加名称(如果是真正的新客户),并重新加载数据

你要处理的是500个名字,而不是500000个。人工操作是完全可行的。试图让SQL匹配相似的名称是很困难的。您将花费更多的时间来解决问题。

查找“汉明距离”或“莱文施泰因距离”。两者都有助于了解“不同”的程度