MySQL如何合并两个表并按name、code分组对num字段求和得到目标表
实现方案
方案1:UNION ALL + 分组聚合(兼容所有主流数据库,推荐)
核心逻辑是先把两个表的全量数据合并,再按公共维度name、code分组求和,不需要额外处理空值逻辑,适配性更强。
SELECT name, code, SUM(num) AS num FROM ( SELECT name, code, num FROM tableA UNION ALL SELECT name, code, num FROM tableB ) AS t_combined GROUP BY name, code ORDER BY name, code;
逻辑说明:
UNION ALL会完整保留两个表的所有记录,不会主动去重- 相同
name+code的记录会被分到同一组,SUM(num)自动实现数值相加逻辑 - 仅在单表存在的分组,
SUM(num)结果就是原记录的num值,完全匹配需求
方案2:FULL OUTER JOIN 实现(仅支持带全外连接的数据库)
如果使用支持FULL OUTER JOIN的数据库(PostgreSQL、SQL Server、Oracle等),也可以用关联方式实现,注意必须处理空值:
SELECT COALESCE(a.name, b.name) AS name, COALESCE(a.code, b.code) AS code, COALESCE(a.num, 0) + COALESCE(b.num, 0) AS num FROM tableA a FULL OUTER JOIN tableB b ON a.name = b.name AND a.code = b.code ORDER BY name, code;
逻辑说明:
COALESCE函数用于取第一个非空值,避免单表存在的记录出现字段为空的问题- 关联条件匹配到的记录,两个表的
num相加,匹配不到的记录加0,等价于保留原值
内容的提问来源于stack exchange,提问作者ChrisChan
相关产品推荐
相关产品推荐

