SQL中用LEFT OUTER JOIN与UNION添加多字段失败的问题求助
解决SQL新增variable2字段的正确方法
你用UNION ALL的方式是错误的——UNION ALL是将两个查询的结果行合并,不会新增列,只会把分别带variable1和variable2的两行数据叠在一起,所以你看到的是重复的类似variable1的结果。
下面是两种正确的实现方式:
方法一:两次LEFT JOIN关联tb2(适合单id对应单条目标数据的场景)
给tb2起不同的别名,分别对应variable1和variable2的筛选条件,就能在同一行获取两个字段的值:
SELECT tb1.id, tb1.start, tb1.end, tb1.name, tb1.code, ROUND(Try_cast(tb2a.Value as float), 0) AS variable1, ROUND(Try_cast(tb2b.Value as float), 0) AS variable2 FROM tb1 LEFT OUTER JOIN tb2 tb2a ON tb1.id = tb2a.ID AND tb2a.Descript LIKE '%Something%' LEFT OUTER JOIN tb2 tb2b ON tb1.id = tb2b.ID AND tb2b.Descript LIKE '%AnotherThing%' -- 替换为variable2对应的筛选条件 WHERE tb1.start >= 0 -- 修正原代码中可能的笔误:tb1.star应为tb1.start ORDER BY tb1.id; -- 补全排序字段
方法二:条件聚合(适合单id对应多条tb2数据的场景,避免结果行重复)
通过CASE WHEN筛选对应条件的Value,配合聚合函数确保每个id只返回一行:
SELECT tb1.id, tb1.start, tb1.end, tb1.name, tb1.code, ROUND(Try_cast(MAX(CASE WHEN tb2.Descript LIKE '%Something%' THEN tb2.Value END) as float), 0) AS variable1, ROUND(Try_cast(MAX(CASE WHEN tb2.Descript LIKE '%AnotherThing%' THEN tb2.Value END) as float), 0) AS variable2 FROM tb1 LEFT OUTER JOIN tb2 ON tb1.id = tb2.ID WHERE tb1.start >= 0 GROUP BY tb1.id, tb1.start, tb1.end, tb1.name, tb1.code ORDER BY tb1.id;
注意事项
- 原代码中的
tb1.star大概率是tb1.start的笔误,记得修正 - 将代码中的
%AnotherThing%替换为你实际需要的variable2对应的Descript筛选规则
内容的提问来源于stack exchange,提问作者iksd
相关产品推荐
相关产品推荐

