2012-04-20 62 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