【问题标题】:T-SQL Get Rows With Similar Company Name Using LevenshteinT-SQL 使用 Levenshtein 获取具有相似公司名称的行
【发布时间】: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


    【解决方案1】:

    那里的查询应该可以正常工作,如果您得到重复,请查看联系人表的内容。

    【讨论】:

      【解决方案2】:

      要减少重复,请改用:

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 2022-11-01
        • 2017-11-27
        • 1970-01-01
        相关资源
        最近更新 更多