【问题标题】:How to compare two tables using a like match based on multiple columns in SQL Server or R如何使用基于 SQL Server 或 R 中的多个列的类似匹配来比较两个表
【发布时间】:2017-06-28 02:21:19
【问题描述】:

我这几天一直在寻找解决方案。我有两个包含以下字段的表

  • 表 1 - OEM_NAME, OEM_MODEL, SUPPLIER - contains 413000 records
  • 表 2 - OEM_Name, Model, Supplier_Name, SUPPLIER_MODEL - contains 208000 records

问题是字段值不完全匹配,我试图在连接条件中使用多个字段的两个表之间实现类似的比较。但是,此查询需要永远执行。有没有更好的方法来实现两个具有多个字段的表之间的相似比较。我熟悉 SQL Server 和 R,所以我非常感谢任何可以在这些平台之一中工作的解决方案/指导。

SELECT COUNT(*)
  FROM Catalog_Table as CAT
  INNER JOIN POPULATION_TABLE AS POP
  ON POP.OEM_NAME LIKE CONCAT(CAT.OEM_NAME,'%') 
   AND POP.OEM_MODEL LIKE CONCAT(CAT.MODEL,'%') 
   AND POP.SUPPLIER LIKE CONCAT(CAT.SUPPLIER_NAME,'%') 

更新:

样本数据:

Sample Data

我还尝试了另一种方法来解决这个问题。我将两个表中的输入字段连接起来形成一个键,并尝试使用这个连接的单个字段来执行匹配 - 精确距离和 Levenshtein 距离(模糊匹配)

期望的结果:

这里的目标是执行相似匹配,然后手动扫描匹配的记录以查看匹配是否有意义。

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • 我添加了示例数据的截图。此处的目标是使用此查询执行类似匹配,然后手动扫描匹配的记录并确定匹配是否有意义。

标签: sql sql-server matching string-matching


【解决方案1】:

你应该尝试这样的事情::

SELECT COUNT(*)
FROM Catalog_Table as CAT
INNER JOIN POPULATION_TABLE AS POP
ON POP.OEM_NAME LIKE CONCAT(CAT.OEM_NAME,'%') 
AND LEFT(POP.OEM_MODEL, LEN(POP.OEM_MODEL)-3) LIKE CONCAT(LEFT(CAT.MODEL,LEN(CAT.MODEL)-3), '%')
AND LEFT(POP.SUPPLIER, LEN(POP.SUPPLIER)-3) LIKE CONCAT(LEFT(CAT.SUPPLIER_NAME, LEN(CAT.SUPPLIER_NAME)-3), '%')
AND LEFT(POP.CATALOG_MODEL, LEN(POP.CATALOG_MODEL)-3) LIKE CONCAT(LEFT(CAT.SUPPLIER_MODEL,LEN(CAT.SUPPLIER_MODEL)), '%') 

如果你赶上我的漂移嘿嘿嘿

【讨论】:

  • 嗨,Alfredo,谢谢你……这似乎是一种有趣的方式来进行类似的比赛。我会试试这个,让你知道它的表现。我能够通过使用 = 符号将最后一个类似匹配更改为完全匹配来解决我的性能问题,这对查询的性能有很大帮助。但是,我相信您的解决方案会给我更多的匹配,并希望它会有更好的性能。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多