SQL多表条件查询问题:同结构两表优先取Table2数据
合并Table1与Table2数据:优先取用Table2内容
表结构
Table1和Table2结构完全一致:
- int 类型的
Id - string 类型的
Name
示例数据
- Table1:
(1,'abc'), (2,'xxx'), (3, 'mm') - Table2:
(1,'abcd'), (3, 'nnnn')
需求
当Table2中存在与Table1相同Id的数据时,取用Table2的Name;若Table2中无对应Id数据,则保留Table1的Name。
预期结果
(1, 'abcd')-- 来自Table2(2, 'xxx')-- 来自Table1(3, 'nnnn')-- 来自Table2
错误尝试的SQL语句
select Table1.Id, case Table2.Name when null then Table1.Name else Table2.Name end as Name from Table1 left join Table2 on Table2.Id = Table1.Id
问题原因
SQL中不能通过when null判断字段是否为null,因为null不等于任何值(包括它自己),Table2.Name = null的结果永远为未知,导致CASE逻辑无法正确触发。
正确解法
解法1:使用COALESCE函数(推荐)
COALESCE会返回传入参数中第一个非null的值,完美匹配“优先取Table2,无则取Table1”的需求:
select Table1.Id, COALESCE(Table2.Name, Table1.Name) as Name from Table1 left join Table2 on Table2.Id = Table1.Id
解法2:修正CASE语句判断逻辑
改用is null来判断字段是否为空:
select Table1.Id, case when Table2.Name is null then Table1.Name else Table2.Name end as Name from Table1 left join Table2 on Table2.Id = Table1.Id
解法3:使用UNION ALL组合结果
先取Table2的全部数据,再补充Table1中未在Table2出现的记录:
select Id, Name from Table2 union all select t1.Id, t1.Name from Table1 t1 where not exists (select 1 from Table2 t2 where t2.Id = t1.Id)
内容的提问来源于stack exchange,提问作者user628661
相关产品推荐
相关产品推荐

