SQL中FROM子查询与WHERE IN子查询的结果差异问题
两条SQL语句的差异说明
核心逻辑差异
两条SQL的统计对象完全不同,是结果不一致的根本原因:
- 第一条SQL的执行逻辑:
先通过三表关联过滤出所有手机号符合匹配规则的人员对应的城市记录,后续分组统计的COUNT(*)是「每个城市下,符合手机号条件的人员总数量」,所有不符合手机号条件的记录都被提前过滤,结果符合你的预期。 - 第二条SQL的执行逻辑:
子查询仅筛选出「存在符合手机号条件人员的城市名单」,外层查询直接统计全量address表中属于这些城市的所有地址的总数量,完全不校验这些地址对应的人员是否满足手机号条件,最终统计的是「有符合条件人员的城市下,所有地址的总数量」,和你的统计目标不符。
示例验证
假设Prague城市共有100条address记录,其中仅10条对应的person关联的手机号符合匹配规则:
- 第一条SQL返回
Prague的统计值为10 - 第二条SQL返回
Prague的统计值为100
修正方案
如果要在第二种写法的基础上得到正确结果,不能仅用IN过滤城市维度,需要保留人员维度的过滤条件,或者将子查询改为关联条件而非IN过滤。
内容的提问来源于stack exchange,提问作者Pavel Václavík
相关产品推荐
相关产品推荐

