Presto/MySQL中表A id IN表B与表B id IN表A结果行数差异疑问
去重后的ID交集确实一致
你提到的维恩图逻辑是成立的:两个查询筛选出的ID,本质都是两张表ID的交集,去重后的集合完全相同。你看到的记录数差异,是因为查询返回的是全量记录而非去重ID,核心原因有以下几类:
记录数不一致的常见原因
1. 单表内存在重复ID
如果同一个交集ID在表A和表B中的出现次数不同,查询返回的总记录数就会有差异。
举个简单例子:
- 交集ID为1、2
- 表A中ID=1有3条记录、ID=2有1条记录,第一个查询返回总条数为4
- 表B中ID=1有1条记录、ID=2有1条记录,第二个查询返回总条数为2
你可以执行下面两个语句验证去重ID的数量是否一致:
-- 第一个查询的去重ID计数 select count(distinct id) from table_a where id in (select id from table_b); -- 第二个查询的去重ID计数 select count(distinct id) from table_b where id in (select id from table_a);
正常情况下两个语句返回的结果完全相同。
2. ID字段存在NULL值
IN子查询的匹配逻辑中,只要子查询返回的结果里包含NULL,整个IN判断的结果就会为未知,最终没有任何记录被命中。如果两张表的ID字段NULL分布不一致,就会出现计数差:
- 若表B的ID存在NULL值,第一个查询的子查询返回结果包含NULL,可能直接返回0条记录
- 若表A的ID没有NULL值,第二个查询的子查询无NULL,会正常返回交集记录
3. ID字段类型不匹配
如果两张表的ID字段类型不同(比如一个是BIGINT,一个是VARCHAR),隐式类型转换时可能出现精度丢失、匹配错误,导致实际命中的交集范围不一致。比如长数值转字符串时溢出、字符串前后带空格导致匹配失败等。
4. 数据或对象逻辑差异
如果查询时存在未提交的事务修改了其中一张表的数据,或者其中一张表是带过滤逻辑的视图/物化视图,也会出现临时的计数差异。
内容的提问来源于stack exchange,提问作者lll
相关产品推荐
相关产品推荐

