【发布时间】:2015-07-03 16:12:38
【问题描述】:
我将这个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 条记录),而且我还有一个更有效的查询。目标是找到使用略有不同的公司名称输入的重复公司,并且此查询返回了太多误报。至于我实际使用的查询,这里太复杂了,超出了这个问题的范围。
【问题讨论】:
标签: sql-server tsql