SQL Server中UNION合并表时填充来自另一表的NULL值
解决SQL Server表合并时的NULL字段填充问题
表结构与数据
Table1(主表)
| Well_id | completion_id | Well_Name | Api_No10 |
|---|---|---|---|
| 111 | 221 | Well1_Comp1 | Well1 |
| 112 | 222 | Well2_Comp1 | Well2 |
| 113 | 223 | Well3_Comp1 | Well3 |
Table2
| Well_id | completion_id | Well_Name | Api_No10 |
|---|---|---|---|
| 111 | Well1_Comp2 | ||
| 114 | Well4_Comp1 | ||
| 115 | Well5_Comp1 |
需求说明
需要基于CONCAT(Well_Id, '_', Well_Name)作为自定义主键Primary_Index,将Table2的数据合并到Table1中;同时当Table2的Well_id在Table1中存在时,用Table1对应的Api_No10值填充Table2中该字段的NULL值。
修改后的SQL实现
WITH Comp_View AS ( SELECT Well_id, Completion_id, Well_Name, Api_No10, CONCAT(Well_Id, '_', Well_Name) AS Primary_Index FROM Table1 ), Pipeline_report AS ( SELECT t2.Well_id, t2.Completion_id, t2.Well_Name, -- 优先用Table2的Api_No10,为空则取Table1对应Well_id的Api_No10 COALESCE(t2.Api_No10, t1.Api_No10) AS Api_No10, CONCAT(t2.Well_Id, '_', t2.Well_Name) AS Primary_Index FROM Table2 t2 LEFT JOIN Table1 t1 ON t2.Well_id = t1.Well_id ) -- UNION自动去重,无需额外过滤重复的Primary_Index SELECT * FROM Comp_View UNION SELECT * FROM Pipeline_report;
关键逻辑说明
- 关联主表填充NULL:在处理Table2数据的CTE中,通过
LEFT JOIN关联Table1的Well_id,确保能获取到主表中对应的Api_No10值。 - COALESCE函数的作用:这个函数会返回参数列表中第一个非NULL的值,刚好满足“Table2有值就用自己的,没值就用主表对应值”的需求。
- 简化去重逻辑:原SQL用子查询过滤重复的
Primary_Index,但UNION本身会自动去除完全重复的行(包括Primary_Index相同的情况),所以直接用UNION即可完成合并+去重。
验证结果
合并后的结果集中:
- Well_id=111、Well_Name=Well1_Comp2的行,Api_No10会被填充为
Well1 - Well_id=114、115的行,因为Table1中没有对应Well_id,Api_No10保持NULL
内容的提问来源于stack exchange,提问作者CodeMaster
相关产品推荐
相关产品推荐

