我希望基于参与连接的所有表中存在的一组列来连接两个(或更多)表。换句话说,我希望基于列的交集来连接表。但是,每个表都有额外的列,这些列对该表是唯一的。
例子
# : 一个数字
- : 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 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