Вы можете значительно упростить эту проблему, если вам требуется, чтобы определенные столбцы do соответствовали или, по крайней мере, начинались с ожиданий того, какие столбцы должны соответствовать.Другими словами, вместо того, чтобы рассматривать это как несоответствующую проблему, переопределите ее как частичное соответствие проблему.
Допустим, вы ожидаете agent
иagency
для совпадения, но customer
и company
могут не совпадать.Это не так уж сложно:
SELECT
i.agent, i.agency, i.customer, i.company, p.customer, p.company,
CASE
WHEN i.customer = p.Customer THEN 'Y'
ELSE 'N'
END AS matchescustomer,
CASE
WHEN i.company = p.Company THEN 'Y'
ELSE 'N'
END AS matchescompany
FROM table1 i
INNER JOIN table2 p
ON p.agent = i.agent
AND p.agency = i.agency
Если вы хотите проверить другие частичные совпадения, просто измените порядок столбцов.Вместо объединения в agent
и agency
, присоединение в agent
и customer
или что-либо еще.
Если вы ожидаете только несколько различных типов частичных совпадений, вы можете написать несколько разных запросов.аналогично приведенному выше и сложите их вместе с UNION
(или UNION ALL
, если вы не возражаете против дубликатов).Другими словами:
SELECT (columns)
FROM table1 i INNER JOIN table2 p
ON p.agent = i.agent AND p.agency = i.agency
UNION
SELECT (columns)
FROM table1 i INNER JOIN table2 p
ON p.agent = i.agent AND p.customer = i.customer
Теперь, если вы хотите получить каждое возможное несоответствие , тогда это быстро выйдет из-под контроля, так что вы можете адаптировать болееэвристический метод и поиск частичных совпадений, которые соответствуют не менее определенному количеству столбцов (скажем, 3).Тогда вы можете ограничить несносность не более чем числом столбцов, которые вы должны сравнить:
;WITH PartialMatches_CTE AS
(
SELECT i.agent AS iagent, p.agent AS pagent, ... (etc.)
FROM table1 i INNER JOIN table2 p ON p.agent = i.agent
UNION ALL
SELECT (...) FROM table1 INNER JOIN table2 ON p.agency = i.agency
UNION ALL
SELECT (...) FROM table1 INNER JOIN table2 ON p.company = i.company
... and so on
),
ResolvedMatches_CTE AS
(
SELECT DISTINCT
iagent, pagent, iagency, pagency, ...,
CASE WHEN pagent = iagent THEN 'Y' ELSE 'N' END AS agentmatch,
CASE WHEN pagency = iagency THEN 'Y' ELSE 'N' END AS agencymatch,
...,
(CASE WHEN pagent = iagent THEN 1 ELSE 0 END +
CASE WHEN pagency = iagency THEN 1 ELSE 0 END +
...) AS MatchCount
FROM PartialMatches_CTE
)
SELECT *
FROM ResolvedMatches_CTE
WHERE MatchCount >= 3
Теперь, после всего сказанного, мне интересно одно ...
Эти две таблицы данных, возможно, не связаны последовательно, не так ли?Например, 3-я строка в таблице 1 всегда отображается на 3-ю строку в таблице 2, но может не соответствовать всем столбцам?Это выстрел в темноте, но если это действительно так, то мы могли бы сделать это способ проще.В противном случае последний запрос здесь, вероятно, должен делать то, что вы хотите, не превращаясь в слишком большую часть бесполезного беспорядка.
Обратите внимание, что производительность, вероятно, снизится для всех этих запросов.Надеюсь, ваши наборы данных не слишком велики.AFAIK, нет простого способа действительно оптимизировать подобные вещи.