2012-04-20 87 views
2

我想比較2個mySQL表來找出它們之間的差異。記錄可以在TableA中找到,但不在TableB中,反之亦然。使用mySQL來比較2個表

我的表如下所示:

表A

Name A1 A2 B1 B2 
------------------------ 
John 11 12 21 23 
John 11 12 21 22 
John 33 34 31 33 
Mary 41 42 54 55 
Mary 71 72 81 82 
Mary 41 42 51 52 

表B

Name A1 A2 B1 B2 C D 
--------------------------------- 
John 11 12 21 22 999 999 
John 21 23 11 12 999 999 
John 31 32 33 34 999 999 
Mary 41 42 51 52 999 999 
Mary 54 55 41 42 999 999 

列A1和A2被認爲是一個基團,B1和B2考慮的另一個組。對於被認爲是一個創紀錄的兩個表中發現,我需要

- TableA(A1,A2) = TableB(A1,A2) AND TableA(B1,B2) = TableB(B1,B2) 

OR

- TableA(A1,A2) = TableB(B1,B2) AND TableA(B1,B2) = TableB(A1,A2) 

對於2個表,上面,我會比較所有表A的John的所有表B的約翰,和所有TableA的瑪麗所有的TableB的瑪麗。

我應該得到的輸出

Name A1 A2 B1 B2 C D 
----------------------------------------------- 
John 31 32 33 34 999 999 (from TableB) 
Mary 41 42 54 55   (from TableA) 
Mary 71 72 81 82   (from TableA) 
Mary 54 55 41 42 999 999 (from TableB) 

我新的MySQL和上面似乎很複雜,我說,我什至不知道從哪裏開始。

我真的很感謝這方面的幫助。

+0

爲什麼表'A'中的'John 33 34 31 33'行沒有出現在結果中?爲什麼從'B'出現'John 31 32 33 34 999 999'? – 2012-04-20 09:16:48

+0

@ypercube因爲'TableB'中有'John 31 32 33 34'。這對應於規則「TableA(A1,A2)= TableB(B1,B2)AND TableA(B1,B2)= TableB(A1,A2)'。 – 2012-04-20 09:18:06

+0

是的,但'32> 33' ... – 2012-04-20 09:18:59

回答

2

如果我的理解正確,則需要發出兩個查詢:一個用於查找TableA中不存在的記錄,TableB不存在,第二個用於相反的情況。請注意,有一種情況是LEFT JOIN,第二種情況是RIGHT JOIN

SELECT a.*, '' AS C, '' AS D, '(from TableA)' AS 'table' 
FROM TableA AS a 
LEFT JOIN TableB AS b 
    ON ((a.A1 = b.A1 AND a.A2 = b.A2 AND a.B1 = b.B1 AND a.B2 = b.B2) 
     OR (a.A1 = b.B1 AND a.A2 = b.B2 AND a.B1 = b.A1 AND a.B2 = b.A2)) 
    AND a.Name = b.Name 
WHERE b.Name IS NULL 

UNION 

SELECT b.*, '(from TableB)' AS 'table' 
FROM TableA AS a 
RIGHT JOIN TableB AS b 
    ON ((a.A1 = b.A1 AND a.A2 = b.A2 AND a.B1 = b.B1 AND a.B2 = b.B2) 
     OR (a.A1 = b.B1 AND a.A2 = b.B2 AND a.B1 = b.A1 AND a.B2 = b.A2)) 
    AND a.Name = b.Name 
WHERE a.Name IS NULL 
+2

您可以使用'UNION ALL'。 – 2012-04-20 09:21:36

+0

@ypercube是的,謝謝你的輸入。然而,這取決於意圖 - 他是否想要重複行。但他應該在兩個表中都加上「Id」。那麼不管它是'UNION ALL'還是'UNION DISTINCT'都沒關係。 – 2012-04-20 09:24:47

+1

'聯盟所有'是更好的表現。在這個查詢中不能有任何重複的行! – 2012-04-20 09:26:24