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

MySQL如何按id列合并两张表并将空值填充为0?

解决MySQL FULL OUTER JOIN后结果不符合预期的问题

嗨,我来帮你搞定这个问题~你遇到的问题主要是因为直接用SELECT *做UNION会保留两张表各自的id列,而且没有处理查询结果里的NULL值。咱们一步步调整SQL语句,就能得到你想要的结果啦。

问题分析

你原来的SQL语句用了LEFT JOIN加RIGHT JOIN再UNION,这确实是MySQL模拟全连接的常见思路,但因为用了SELECT *,两张表的id列会被分别保留(结果里的id和id(1)),同时未匹配到的数据会显示NULL,这就和你期望的格式不一致了。

正确的SQL语句

我们可以先获取所有存在的id集合,再分别左连接两张表,最后用COALESCE函数把NULL替换成0:

SELECT
  all_ids.id,
  COALESCE(tbl_a.Col_A, 0) AS Col_A,
  COALESCE(tbl_a.Col_B, 0) AS Col_B,
  COALESCE(tbl_b.Col_C, 0) AS Col_C,
  COALESCE(tbl_b.Col_D, 0) AS Col_D
FROM
  -- 先获取两张表中所有唯一的id
  (SELECT id FROM tbl_a UNION SELECT id FROM tbl_b) AS all_ids
-- 左连接tbl_a,确保每个id都能匹配到对应数据(无匹配则为NULL)
LEFT JOIN tbl_a ON all_ids.id = tbl_a.id
-- 同理左连接tbl_b
LEFT JOIN tbl_b ON all_ids.id = tbl_b.id
-- 按id排序,和你预期的结果顺序一致
ORDER BY all_ids.id;

语句说明

  1. 获取所有id集合:用(SELECT id FROM tbl_a UNION SELECT id FROM tbl_b)得到两张表中所有不重复的id(也就是1、2、3、4),作为后续连接的基础。
  2. 左连接两张表:分别和tbl_a、tbl_b左连接,保证每个id都能出现在结果中,没有匹配到的字段会显示NULL。
  3. 替换NULL为0:用COALESCE(字段名, 0)函数,当字段值为NULL时返回0,否则返回字段本身的值,完美贴合你想要的格式。

执行这个语句后,就能得到你期望的结果啦~

内容的提问来源于stack exchange,提问作者Shi J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:22:44