我正在尝试找到不在应用表中的人数。
我有两个表( person and Application ),与应用程序有一对多关系( person.id = application.person.person )。但是,一个人可能没有申请。应用表中大约有35K记录。为了这篇文章,我能够减少查询,但仍会产生问题。我希望第一个查询会产生与第二个相同数量的结果,但没有。
为什么此查询产生零结果:
select count(*)
from person p where (p.id not in (
select person
from application
))
此查询产生预期结果:
select count(*)
from person p where (p.id not in (
select person
from application
where person=p.id
))
根据我的理解,第二个查询是正确的,因为:
- 当人没有应用程序时,内部选择返回null
p.id not in null
返回true - 当人拥有应用程序时,内部选择返回应用程序P.ID
app p.id not in p.id
返回false
但是,我不明白为什么第一个查询不等于第二个。
有人可以解释(谢谢)?
您不应将not in
与子查询一起使用。它不能正确处理NULL
值(或至少直观地)。而是将查询称为 not exists
:
select count(*)
from person p
where not exists (select 1
from application a
where a.person = p.id
);
使用NOT IN
,如果 subquery返回NULL
中的任何行,则根本没有返回行回外查询。
带有相关子句的版本限制了损坏。但是,我的建议是简单地使用NOT EXISTS
。