gpt4 book ai didi

sql-server - 连接表 ON A ∩ B 条件

转载 作者:行者123 更新时间:2023-12-02 20:52:54 25 4
gpt4 key购买 nike

我希望根据参与连接的所有表中存在的一组列来连接两个(或更多)表。换句话说,我希望根据列的交集来连接表。但是,每个表都有该表独有的额外列。

Intersection set

示例

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

最佳答案

正是完全外部联接的东西:

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

关于sql-server - 连接表 ON A ∩ B 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11003657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com