可以简化这个问题急剧如果您需要记录某些列做匹配,或者至少从某些期望开始,应与匹配。换句话说,不要把这看作是不匹配的问题,重新定义它为部分匹配的问题。
假设您期望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)。然后,你可以最多限制obnoxiousness到的列数,你必须比较:
;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
现在,说了这么多,有一两件事我不知道......
这两个数据表不是,偶然的,依次相关的,是吗?如中所示,table1中的第3行总是映射到表2中的第3行,但可能不匹配所有列?这是在黑暗中拍摄的,但如果确实如此,那么我们可以简化这种方式。否则,这里的最后一个查询应该可以做你想要的,而不会变成太大部分不可维护的混乱。
请注意,对于所有这些查询,性能可能会很差。希望你的数据集不太大。 AFAIK没有简单的方法来真正优化这种事情。
@Tony_Henrich:我觉得这可能很难。你能否澄清一下:说一行(代理和代理)或者(客户和公司)匹配 - 你想看什么? – 2010-01-23 00:13:34
如果代理和代理商匹配,我想查看'客户,公司'或他们的价值。 – 2010-01-23 00:32:33
我还是不明白......你能解释一下,你想像一个5岁的孩子一样完成什么?如果不是在查询方面,但在信息方面更好。 – jachguate 2010-01-23 01:23:13