MySQL关联两张表时重复ID优先保留第一张表数据的实现问题
MySQL多表优先合并解决方案
核心逻辑
不需要做字段级合并判断,拆分两次查询后通过UNION ALL合并结果,完全规避COALESCE函数不支持数组类型的问题:
- 全量获取优先表
COMPANIES ESTIMATED的所有数据 - 仅获取次表
COMPANIES MIXED中ID未出现在优先表中的数据
具体实现
1. 直接查询合并结果
SELECT * FROM `COMPANIES ESTIMATED` UNION ALL SELECT * FROM `COMPANIES MIXED` m WHERE NOT EXISTS ( SELECT 1 FROM `COMPANIES ESTIMATED` e WHERE e.id = m.id )
2. 生成新的结果表COMPANIES FINAL
如果需要将结果持久化为新表,执行以下语句即可:
CREATE TABLE `COMPANIES FINAL` AS SELECT * FROM `COMPANIES ESTIMATED` UNION ALL SELECT * FROM `COMPANIES MIXED` m WHERE NOT EXISTS ( SELECT 1 FROM `COMPANIES ESTIMATED` e WHERE e.id = m.id )
方案优势
- 完全满足优先级规则:同ID数据仅保留
COMPANIES ESTIMATED的整行内容,不会混入次表同ID数据 - 兼容所有字段类型:不需要调用COALESCE等字段处理函数,字符串数组、JSON等复杂类型字段都可以完整保留原始值
- 执行效率高:id字段加索引的情况下,千万级大表也可以快速完成合并
注意事项
- MySQL中带空格的表名/字段名需要用反引号
`包裹,如果你的实际表名使用下划线等合法标识符,可去掉反引号 - 如果两张表的字段顺序不一致,将语句中的
*替换为明确的字段列表,保证UNION前后两个查询的字段数量、顺序、类型完全匹配
内容的提问来源于stack exchange,提问作者RaxGG
相关产品推荐
相关产品推荐

