可以簡化這個問題急劇如果您需要記錄某些列做匹配,或者至少從某些期望開始,應與匹配。換句話說,不要把這看作是不匹配的問題,重新定義它爲部分匹配的問題。
假設您期望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