2017-02-09 19 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,'%') 

Update:

Образец данных:

Sample Data

Я также попробовал другой подход к решению этой проблемы. Я сцепляюсь полей ввод в обеих таблицах, чтобы сформировать ключ и попытался использовать это единственное сцепленное поле, чтобы выполнить матч - как точный и Левенштейн (нечеткое соответствие)

Желаемого результата:

Цели здесь выполнить аналогичное совпадение, а затем вручную отсканировать сопоставленные записи, чтобы увидеть, имеет ли смысл смысл.

+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

Hi Alfredo, Спасибо за это .. это, кажется, интересный способ выполнить подобный матч. Я попробую это и дам вам знать, как это работает. Мне удалось решить мою проблему с производительностью, изменив последнее совпадение на точное соответствие с помощью символа =, и это очень помогло с точки зрения производительности запроса. Тем не менее, я считаю, что ваше решение даст мне намного больше матчей и, надеюсь, оно будет иметь лучшую производительность. – Satbir