結合に参加するすべてのテーブルに存在する一連の列に基づいて、2 つ (またはそれ以上) のテーブルを結合したいと考えています。つまり、列の交差セットに基づいてテーブルを結合したいと考えています。ただし、各テーブルには、そのテーブルに固有の追加の列があります。
例
# : 数値
- : NULL
表 A
+------+------+------+
| Col1 | Col2 | ColA |
+------+------+------+
| A | A | # |
| A | B | # |
+------+------+------+
表 B
+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| A | A | # |
| B | B | # |
+------+------+------+
結果
+------+------+------+------+
| Col1 | Col2 | ColA | ColB |
+------+------+------+------+
| A | A | # | # |
| A | B | # | - |
| B | B | - | # |
+------+------+------+------+
私は解決策を思いつきましたが、パフォーマンスはひどいもので、パフォーマンスが問題です。そのソリューションであなたを汚染したくありません。私はむしろこれに新鮮な目を向けたいと思います:)
あなたの解決策を楽しみにしています。お時間をいただきありがとうございます。とても感謝しています。
アップデート
すべての応答に感謝します。しかし、私は問題を十分に説明していないようです。(まだすべての回答をテストしていません)
ただし、テーブル B には、テーブル A には存在しない行があることに注意してください。
Table B
+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| B | B | # |
+------+------+------+
そしてテーブルAはその逆です。
私が思いついた解決策は、列の交差セットですべてのテーブルを結合してスケルトンを生成することです。
Skeleton:
SELECT Col1, Col2 FROM TableA
UNION
SELECT Col1, Col2 FROM TableB
スケルトンを取得したら、各テーブルの LEFT OUTER JOIN を実行します。
LEFT OUTER JOIN TableA AS a ON a.Col1=skeleton.Col1 AND a.Col2=skeleton.Col2
LEFT OUTER JOIN TableB AS b ON b.Col1=skeleton.Col1 AND b.Col2=skeleton.Col2
したがって、最終的なクエリは次のようになります
SELECT s.*, a.ColA, b.ColB
FROM
(
SELECT Col1, Col2
FROM TableA
UNION
SELECT Col1, Col2
FROM TableB
) s
LEFT OUTER JOIN TableA a ON a.Col1=s.Col1 AND a.Col2=s.Col2
LEFT OUTER JOIN TableB b ON b.Col1=s.Col1 AND b.Col2=s.Col2