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

MySQL多表查询:主键重复时保留第二表记录的实现

解决方案

有两种常用方法可以实现你的需求:

方法一:使用COALESCE结合左连接

通过左连接关联两张表后,用COALESCE函数优先取table_b的字段值,当table_b中没有对应记录时,再回退到table_a的字段值,既能实现覆盖效果,又能保留你需要的两列结构:

SELECT 
    COALESCE(b.id, a.id) AS id,
    COALESCE(b.date, a.date) AS date
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id;

执行结果与你的预期完全一致:

+----+------------+
| id | date       |
+----+------------+
|  1 | 2023-02-02 |
|  2 | 2023-10-12 |
|  3 | 2022-11-11 |
+----+------------+

方法二:使用UNION ALL结合存在性筛选

先保留table_b的全部记录,再补充table_a中未被table_b覆盖的记录,天然实现重复id的覆盖逻辑:

SELECT id, date FROM table_b
UNION ALL
SELECT a.id, a.date 
FROM table_a a
WHERE NOT EXISTS (SELECT 1 FROM table_b b WHERE b.id = a.id);

这个方法逻辑更直观,先拿优先级高的table_b数据,再补充table_a里独有的记录,结果同样符合要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:40:00