2017-02-09 79 views
0

我一直在试图寻找一个解决方案来解决这个问题。我有两个表具有以下字段如何使用基于SQL Server或R中多个列的类似匹配来比较两个表

  • 表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距离(模糊匹配)

所需的结果:

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

+0

请提供样本数据和预期的结果。 –

+0

我已添加示例数据的屏幕截图。这里的目标是使用此查询执行类似的匹配,然后手动扫描匹配的记录并确定匹配是否有意义。 – Satbir

回答

0

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

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)), '%') 

如果你明白我的意思呵呵呵

+0

嗨阿尔弗雷多, 谢谢你..这似乎是一个有趣的方式来执行一个喜欢的比赛。我会试试这个,并会让你知道它是如何执行的。 我能够通过将最后一个匹配更改为使用=符号的完全匹配来解决我的性能问题,并且在查询性能方面提供了很多帮助。不过,我相信你的解决方案会给我更多的比赛,并希望它会有更好的表现。 – Satbir

相关问题