在A∩B条件下加入表格

Snæ*_*ørn 6 sql-server

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

交叉点设置

#:数字
-: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)

我想出了一个解决方案,但性能很糟糕,性能是一个问题.我不想用这个解决方案污染你.我宁愿有一双新鲜的眼睛:)

期待看到您的解决方案.感谢您的时间.非常感谢.

UPDATE

谢谢你的所有回应.但似乎我没有充分解释这个问题.(尚未测试所有答案)

但请注意表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)

And*_*mar 3

正好适合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)

  • 他可能对叉积感兴趣,但他说“在列的交集上”,这意味着结构,而不是数据。 (2认同)