SQL使用exists查询两表匹配行数不一致,如何用not exists求表差异
两个反向exists查询的匹配行数是否应当一致
两个查询的返回值没有强制相等的要求,结果不一致属于非常正常的场景,核心影响因素是用于关联的组合键(field1+field2+field3 拼接形成的匹配标识)在两张表内的重复存储情况:
- 如果该组合键在两张表内都是无重复的唯一键(即同一个组合值最多存储1条记录),两个查询的返回行数必然完全相等
- 如果任意一张表存在同一组合键的多条重复记录,两个查询的返回行数就会出现差值:
举个实际遇到最多的场景:table2中存储1条关联键为(F1=1, F2=2, F3=3)的记录,table1中因为业务导入重复,存了5条完全相同关联键的记录- 执行table1侧的exists查询时,这5条记录都会满足“能在table2找到匹配”的条件,全部计入统计值,贡献5行结果
- 执行table2侧的exists查询时,那1条table2的记录只要能匹配到任意1条table1的同键记录,就会被计入统计,不会因为table1有多条重复就重复累加,仅贡献1行结果
你当前两次结果的差值为939234 - 938796 = 438,本质就是table1中存在一批关联组合键,这些键在table2内是单条存在,但在table1内存在重复存储,累计拉抬了table1侧的匹配统计值。
仅将
where exists改为where not exists能否获取全部差异数据 这种写法只能覆盖一部分差异场景,无法实现全量差异排查的目标,具体边界如下:
- 可覆盖的差异类型:
- 对table1的查询把
where exists替换为where not exists后,会返回所有table1内存在、但table2完全找不到同组合键匹配的table1独有记录 - 对table2的查询把
where exists替换为where not exists后,会返回所有table2内存在、但table1完全找不到同组合键匹配的table2独有记录
- 对table1的查询把
- 无法覆盖的差异类型:
当同一关联组合键在两张表内都存在、但两边存储的记录条数不对等时(比如前述场景下table1存5条同键记录、table2仅存1条同键记录),not exists的判断条件根本不会触发,这类“同键不同量”的隐性差异会被完全漏查。
如果需要排查全量差异,除了执行上述两个not exists查询捞取两表独有的记录外,还需要额外按三个关联字段分组,分别统计table1、table2内每个关联键的存储条数,筛出两边计数不一致的关联键,再导出对应明细核对重复存储的问题。
内容的提问来源于stack exchange,提问作者imandy
相关产品推荐
相关产品推荐

