我想对三个表进行条件连接。左连接表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。如果表中有数百列,那就太烦人了。 最好在整个别名上进行合并,例如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中我会得到所有好的数据而不会在所有列中合并?
答案 0 :(得分:2)
虽然我没有发现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)