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
相关产品推荐
相关产品推荐

