我希望基于参与连接的所有表中存在的一组列来连接两个(或更多)表.换句话说,我希望基于交集列连接表.但是,每个表都有额外的列,这些列对于该表是唯一的.

#:数字
-:NULL
表A.
+------+------+------+
| Col1 | Col2 | ColA |
+------+------+------+
| A | A | # |
| A | B | # |
+------+------+------+
Run Code Online (Sandbox Code Playgroud)
表B.
+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| A | A | # |
| B | B | # |
+------+------+------+
Run Code Online (Sandbox Code Playgroud)
结果
+------+------+------+------+
| Col1 | Col2 | ColA | ColB |
+------+------+------+------+
| A | A | # | # |
| A | B | # | - |
| B | B | - | # |
+------+------+------+------+
Run Code Online (Sandbox Code Playgroud)
我想出了一个解决方案,但性能很糟糕,性能是一个问题.我不想用这个解决方案污染你.我宁愿有一双新鲜的眼睛:)
期待看到您的解决方案.感谢您的时间.非常感谢.
谢谢你的所有回应.但似乎我没有充分解释这个问题.(尚未测试所有答案)
但请注意表B中有一行表A中没有的行.
Table B
+------+------+------+
| Col1 | Col2 | ColB |
+------+------+------+
| B | B | # |
+------+------+------+
Run Code Online (Sandbox Code Playgroud)
而表A反之亦然.
解决方案我提出将所有表联合在一起,在列的交集上生成一个骨架.
Skeleton:
SELECT Col1, Col2 FROM TableA
UNION
SELECT Col1, Col2 FROM TableB
Run Code Online (Sandbox Code Playgroud)
一旦我有了骨架,我就为每张桌子留下了外部联接.
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
Run Code Online (Sandbox Code Playgroud)
所以最终查询看起来像这样
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
Run Code Online (Sandbox Code Playgroud)
正好适合full outer join:
select coalesce(a.Col1, b.Col1) as Col1
. coalesce(a.Col2, b.Col2) as Col2
, a.ColA
, b.ColB
from A a
full outer join
B b
on a.Col1 = b.Col1
and a.COl2 = b.Col2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |