我正在使用这个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条记录),而且我也有一个更有效的查询。目标是找到使用稍微不同的公司名称输入的重复公司,并且此查询返回了太多误报。至于我实际使用的查询,这个问题太复杂了,不能在这个问题的范围内显示。
答案 0 :(得分:2)
要减少重复项,请改为使用:
SELECT * FROM Contacts c1, Contacts c2
WHERE dbo.ufnCompareString(c1.Company, c2.Company) < 5
AND c1.id < c2.id
返回所有唯一的联系人对,其距离小于5.
答案 1 :(得分:0)
您在那里的查询应该正常工作,如果您正在获取重复项,请查看“联系人”表的内容。