如何比对两个SQL查询结果差异并返回较新日期的差异行
跨日期录入数据差异查询方案
涉及表结构
查询目标表字段如下:
Name | Size | DateSale | Location | Comments | Date
匹配规则说明
- 联合
Name、Size两个字段作为匹配键,关联两个日期的同键数据 - 对比字段为
DateSale、Location、Comments,任意字段值不一致即判定为存在差异 - 存在差异的数据仅返回日期更新(即
Date='06/02/2022')的对应行,字段完全一致的行不返回
原有方案问题
SELECT DISTINCT仅能对单个结果集做去重处理,无法实现两个日期的数据集按指定键关联、逐字段对比的需求,因此无法得到预期结果。
可直接运行的实现代码
通过表自连接关联新旧两个日期的数据,逐字段判断差异即可,代码兼容空值对比场景:
SELECT t_new.Name, t_new.Size, t_new.DateSale, t_new.Location, t_new.Comments, t_new.Date FROM [Table] t_new INNER JOIN [Table] t_old ON t_new.Name = t_old.Name AND t_new.Size = t_old.Size AND t_old.Date = '06/01/2022' WHERE t_new.Date = '06/02/2022' AND ( t_new.DateSale != t_old.DateSale OR t_new.Location != t_old.Location OR (t_new.Comments IS NULL AND t_old.Comments IS NOT NULL) OR (t_new.Comments IS NOT NULL AND t_old.Comments IS NULL) OR t_new.Comments != t_old.Comments )
如果使用的数据库支持
IS DISTINCT FROM语法(如PostgreSQL、SQL Server 2022及以上版本、MySQL 8.0+),可以将上述Comments相关的三个判断条件简化为OR t_new.Comments IS DISTINCT FROM t_old.Comments,该语法可自动识别空值差异。
结果验证
基于提供的样例数据执行上述代码:
- 匹配键
jake+90对应的新旧两行数据三个对比字段完全一致,不会被返回 - 匹配键
john+100对应的新旧行三个字段均存在差异,返回新日期对应行,完全符合预期:
john | 100 |06/05/2022| Houston | proj. | 06/02/2022
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

