一次性SQL条件连接到多个表

时间:2016-05-04 10:28:15

标签: sql sql-server sql-server-2008 join

我想对三个表进行条件连接。左连接表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中我会得到所有好的数据而不会在所有列中合并?

1 个答案:

答案 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)