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

标签 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(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/

相关文章:

mysql - 如果某一数据有多条记录,如何求和?

sql - 检查 SQL Server 中的重复数据

sql - 如何在整个数据库中查找字符串?

sql-server - 存储过程最佳实践

mysql - 复杂的sql查询没有给出预期的结果

mysql - 仅当值不存在时返回行

sql-server - 只读访问执行SP/获取结果集的作用,无需间接修改db?

mysql - 适用于 .MDB 数据库的 SQL 查询不适用于 MySQL 数据库

sql - 如何让查询更快?

sql - 为列中的每一行生成 guid