SQL语句主查询和子查询结果不一致

select count(*) from basic_jyj_xsjbxxb where sfzh in ( ----56371
select sfzh from ( --56777
select stu.sfzh
from basic_jyj_xsjbxxb stu inner join BASIC_GA_LDRKDJXX_WZ ld on ld.sfzhm=stu.sfzh where stu.xd='小学' and SSJD is not null
--查询流动人口中各街道人口结构
union all
select stu.sfzh
from basic_jyj_xsjbxxb stu inner join BASIC_GA_CZRKDJXX_WZ cz on cz.sfzhm=stu.sfzh where stu.xd='小学' and xzjd is not null
--查询常住人口中在各街道人口结构
)
)
这是主查询,查询结果是 56371

单独查询里面的子查询,查询结果是 56777
select count(sfzh) from ( --56777
select stu.sfzh
from basic_jyj_xsjbxxb stu inner join BASIC_GA_LDRKDJXX_WZ ld on ld.sfzhm=stu.sfzh where stu.xd='小学' and SSJD is not null
--查询流动人口中各街道人口结构
union all
select stu.sfzh
from basic_jyj_xsjbxxb stu inner join BASIC_GA_CZRKDJXX_WZ cz on cz.sfzhm=stu.sfzh where stu.xd='小学' and xzjd is not null
--查询常住人口中在各街道人口结构
)
注:sfzh没有重复数据,没有空数据

需求:为什么两次的结果会不一致?

你把子查询的union all 改成union 试试 ,可能是两个union all的结果之间有重复

子查询中查询出sfzh 字段的数据有null数据,主查询 in 的时候,直接过滤了这些null数据导致的数据不一致!
解决办法:
在主查询的后面加上 or sfzh is null 这个条件,就会查询的数据一致了!