SQL中对比freshdesk与storage表并获取正确数据的查询需求
合并freshdesk与storage表并优先保留storage最新数据的SQL方案
需求说明
- 取出
freshdesk表的全部记录 - 匹配
storage表中对应ID的记录 - 保留
storage表中未在freshdesk里的新记录 - 同ID下,
storage的字段数据优先级高于freshdesk(即storage有更新时取它的最新值)
原查询的问题
你提供的UNION方式逻辑不准确:它只是简单合并两次LEFT JOIN的结果,既无法实现字段优先级覆盖,还可能产生重复数据,不能满足“优先取storage最新数据”的核心需求。
标准SQL解决方案(支持FULL OUTER JOIN的数据库:PostgreSQL、SQL Server等)
SELECT COALESCE(s.id, f.id) AS id, COALESCE(s.title, f.title) AS title, COALESCE(s.content, f.content) AS content, -- 按实际字段依次替换,所有字段都用COALESCE优先取storage的值 COALESCE(s.update_time, f.update_time) AS update_time FROM freshdesk f FULL OUTER JOIN storage s ON f.id = s.id;
- 原理:
COALESCE函数返回第一个非空值,确保storage的字段值会覆盖freshdesk的对应字段;FULL OUTER JOIN保证两张表的所有记录都被包含,不会遗漏任何一方的独有关联记录。
MySQL兼容方案(MySQL不支持FULL OUTER JOIN)
SELECT COALESCE(s.id, f.id) AS id, COALESCE(s.title, f.title) AS title, COALESCE(s.content, f.content) AS content, COALESCE(s.update_time, f.update_time) AS update_time FROM freshdesk f LEFT JOIN storage s ON f.id = s.id UNION SELECT s.id, s.title, s.content, s.update_time FROM storage s LEFT JOIN freshdesk f ON f.id = s.id WHERE f.id IS NULL;
- 原理:第一部分通过
LEFT JOIN获取freshdesk的所有记录并优先用storage的字段值;第二部分单独取出storage中不存在于freshdesk的新记录,最后用UNION合并结果(自动去重)。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

