T-SQL使用Levenshtein获得具有相似公司名称的行

时间:2015-04-24 21:38:30

标签: sql-server tsql

我正在使用这个Levenshtein function用于T-SQL,效果很好(我并不担心性能)。现在我想编写一个查询,返回Levenshtein距离小于x的所有行(例如x可能是5),使用公司名称字段进行比较。

我尝试过以下操作,但它会返回数千个重复的行。

SELECT * FROM Contacts c1, Contacts c2
WHERE dbo.ufnCompareString(c1.Company, c2.Company) < 5
AND c1.id <> c2.id

我希望它显示如下列表:

1   Apple Experts
20  Apple Experts Inc.
240 H&K Paving
21  H and K Paving
98  HK Paving
189 H.K. Paving
5   J.M. Lawn Care
105 JM Lawn Care

有可能做这样的事吗?我做错了什么?

修改

我最终得到的查询看起来像这样。我发现有一些“无效”条目导致我遇到的问题:

SELECT c1.ContactId, c1.Company, c1.LastName, c1.FirstName,
   c2.ContactId, c2.Company, c2.LastName, c2.FirstName
FROM Contacts c1, Contacts c2
WHERE Cast(c1.ContactId AS INT) < Cast(c2.ContactId AS INT)
   AND c1.Company IS NOT NULL 
   AND Replace(c1.Company, ' ', '') <> ''
   AND c2.Company IS NOT NULL
   AND Replace(c2.Company, ' ', '') <> ''
   AND Len(c1.Company) > 6
   AND Len(c2.Company) > 6
   AND dbo.ufnCompareString(c1.Company, c2.Company) < 5

请注意,查询运行速度非常慢(大约有12,000条记录),而且我也有一个更有效的查询。目标是找到使用稍微不同的公司名称输入的重复公司,并且此查询返回了太多误报。至于我实际使用的查询,这个问题太复杂了,不能在这个问题的范围内显示。

2 个答案:

答案 0 :(得分:2)

要减少重复项,请改为使用:

SELECT * FROM Contacts c1, Contacts c2
WHERE dbo.ufnCompareString(c1.Company, c2.Company) < 5
AND c1.id < c2.id

返回所有唯一的联系人对,其距离小于5.

答案 1 :(得分:0)

您在那里的查询应该正常工作,如果您正在获取重复项,请查看“联系人”表的内容。