You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:46:05