我想对三个表进行条件连接。左连接表 B,如果键缺失则连接到表 C。
+------+--+------+-------------+--+------+-------------+
| A.id | | B.id | B.OtherFish | | C.id | C.OtherFish |
+------+--+------+-------------+--+------+-------------+
| 1 | | 1 | B1 | | 1 | C1 |
| 2 | | | | | 2 | C2 |
| 3 | | 3 | B3 | | 3 | C3 |
| 4 | | | | | 4 | C4 |
| 5 | | 5 | B5 | | | |
| 6 | | 6 | B6 | | 6 | C6 |
+------+--+------+-------------+--+------+-------------+
B 中没有 2 和 4 的匹配键,C 中也没有 5 的匹配键。 预期结果:
+------+-----------+
| A.id | OtherFish |
+------+-----------+
| 1 | B1 |
| 2 | C2 |
| 3 | B3 |
| 4 | C4 |
| 5 | B5 |
| 6 | B6 |
+------+-----------+
我使用的查询是:
select
A.id
,coalesce(B.id,C.id)
,coalesce(B.OtherFish,C.OtherFish)
from A
left join B
on A.id=B.id
left join C
on A.id=C.id
该方法的缺点是我必须对不同表中我需要的所有列进行合并。如果表中有数百列,那就很烦人了。 最好对整个别名进行合并,例如 coalesce(B,C)
。
是否可以一次性完成:
left join B
on A.id=B.id
left join C
on A.id=(case when B.id is null then C.id end)
这样在 C.id 中我就可以获得所有好的数据,而无需合并所有列?
最佳答案
虽然我没有发现 COALESCE
有什么问题,但您可以尝试使用 UNION
,如下所示:
SELECT a.id,t.OtherFish
FROM A
LEFT JOIN(SELECT b.id,b.otherFish FROM b
UNION ALL
SELECT c.id,c.otherFish FROM C
where c.id NOT EXISTS(SELECT 1 FROM b bb WHERE bb.id = c.id)) t
ON(a.id = t.id)
关于SQL 条件连接一次性连接到多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37025086/