SQL Server 2019三表关联取值问题:优先取第二表值,无则取第三表
问题分析与解决方案
原SQL语句执行无数据返回的核心原因是使用了Inner Join,这种关联方式要求Table1必须同时在Table2和Table3中存在匹配的ID记录才会返回结果。只要其中任意一张表没有对应记录,整行数据就会被过滤掉,不符合你"优先从Table2取值,无值则从Table3取值"的需求。
修正后的SQL语句
可以使用LEFT JOIN来保留Table1的所有记录,同时结合COALESCE函数(SQL Server支持)快速实现"优先取非空值"的逻辑,代码如下:
SELECT Table1.ID, COALESCE(Table2.Value2, Table3.Value3) AS Value FROM Table1 LEFT JOIN Table2 ON Table1.ID = Table2.ID2 LEFT JOIN Table3 ON Table1.ID = Table3.ID3
关键说明
LEFT JOIN Table2:确保Table1的每条记录都被保留,即使Table2中没有匹配的ID2,此时Table2.Value2会返回NULLLEFT JOIN Table3:同理,保留Table1记录,无匹配时Table3.Value3为NULLCOALESCE(Table2.Value2, Table3.Value3):依次检查参数,返回第一个非NULL的值,完美契合"优先取Table2,无值取Table3"的需求
如果你更习惯用CASE语句,也可以替换成以下写法,效果完全一致:
SELECT Table1.ID, CASE WHEN Table2.Value2 IS NOT NULL THEN Table2.Value2 ELSE Table3.Value3 END AS Value FROM Table1 LEFT JOIN Table2 ON Table1.ID = Table2.ID2 LEFT JOIN Table3 ON Table1.ID = Table3.ID3
内容的提问来源于stack exchange,提问作者ari
相关产品推荐
相关产品推荐

