2012-04-20 15 views
2

私は2つのmySQLテーブルを比較して、その違いを見つけようとしています。レコードはTableAでは見つかるかもしれませんが、TableBでは見つからないかもしれません。mySQLを使用して2つのテーブルを比較する

TableAの

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 

TableBの

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は、他のグループと見なされます。

私のテーブルは以下の通りです。両方のテーブルで見つけ考慮すべき記録のために、私は2つのテーブルについて

- 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) 

を必要とし、上記の、私はテーブルBのジョンの全てにテーブルAのジョンの全てを比較し、すべてのだろうテーブルBのメアリーのすべてにテーブルAのメアリーの。

私は出力

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 3431 33」行が結果に表示されないのはなぜですか? 'B 'から' John 31 32 33 34 999 999 'が出現するのはなぜですか? –

+0

@ypercube 'TableB'に' John 31 32 33 34'があるので。これはルール「TableA(A1、A2)= TableB(B1、B2)AND TableA(B1、B2)= TableB(A1、A2)」に対応する。 –

+0

ええ、 '32 <> 33' ... –

答えて

2

私が正しく理解していれば、TableAのレコードがTableBに存在しないことと、反対の状況のレコードが2つ見つかります。あるケースではLEFT JOINであり、2番目のケースでは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を使うことができる。 –

+0

@ypercubeはい、ありがとうございました。それは、重複した行を必要とするかどうかにかかわらず、意図に依存します。しかし、彼はどちらのテーブルにも "Id"を追加するべきです。それでは、それが 'UNION ALL'か' UNION DISTINCT'かどうかは関係ありません。 –

+1

'UNION ALL'はパフォーマンスの点で優れています。このクエリでは、行を重複させることはできません! –

関連する問題