使用SQL进行重复数据删除,SELECT类似字段

时间:2013-07-17 18:16:18

标签: sql ms-access

我在一个名为“CustomerName”的字段中有一个包含500多个客户名称的访问订单数据库

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

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

我对如何做到这一点感到茫然,感谢任何帮助。

非常感谢!

4 个答案:

答案 0 :(得分:1)

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

如果没有一个庞大的公司数据库,我很难对其进行测试,但也许这个想法会有所帮助。

答案 1 :(得分:1)

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

Finding how similar two strings are

以上链接是针对另一个SO问题,该问题讨论了通常用于执行此操作的不同算法。

Levenshtein Distance in Excel

以上链接是一个SO问题,其中包含VBA

中某个方法的实现

答案 2 :(得分:1)

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

这应该不到一个小时。

然后,将其上传到数据库中的新表。新表将具有“真实客户名称”和“替代名称”。访问表格时,请进行连接以获取真实姓名。

这解决了眼前的问题。

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

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

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

您正在处理500个名称,而不是500,000个名称。手动过程非常可行。试图让SQL匹配相似的名称很难。你会花更多的时间来解决这个问题。

答案 3 :(得分:0)

此语法适用于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

它为您提供前10个字符相同的记录。但是,对于你的尝试,我认为它不够彻底。我想你必须完成整个数据库。

此外,您可能需要考虑在修复过去之前修复未来。换句话说,做一些事情来防止再次发生,这样你只需要做一次这个工作。