如何将SQL缺失记录与更新记录查询合并为单条语句?
合并SQL查询的解决方案
可以通过一次LEFT JOIN并在WHERE子句中组合两个条件,替代原来两条查询加UNION DISTINCT的写法,同时满足获取缺失记录和更新记录的需求:
SELECT source.id, source.modified_at FROM source LEFT JOIN destination ON source.id = destination.id WHERE destination.id IS NULL OR source.modified_at > destination.modified_at;
逻辑说明
- 获取缺失记录:
LEFT JOIN后destination.id IS NULL的条件,会筛选出所有在source表存在但destination表中无匹配id的记录,和你原“缺失记录”查询逻辑完全一致。 - 获取更新记录:
source.modified_at > destination.modified_at的条件,会筛选出source与destination有匹配id,但source记录更新时间晚于destination对应记录的情况,精准匹配你需要的“源表最新数据”需求。
对比原写法的优势
- 省去
UNION DISTINCT带来的额外去重开销,查询效率更高。 - 单条语句逻辑紧凑,更便于维护和理解。
注:如果你的业务逻辑确实需要基于
destination表的全局最大更新时间筛选(而非单条记录对比),可以调整WHERE条件为:WHERE destination.id IS NULL OR source.modified_at >= (SELECT MAX(modified_at) FROM destination);这种写法会筛选出所有更新时间晚于等于
destination全局最新时间的源记录,同时保留缺失记录。
内容的提问来源于stack exchange,提问作者JordanGS
相关产品推荐
相关产品推荐

