Sql 为什么这两个查询产生不同的结果?
我正在试图找到申请表中没有的人数 我有两个表(person和application),其中person与application有一对多的关系(person.id=application.person)。但是,个人可能没有申请。应用程序表中大约有35K条记录。为了这篇文章,我能够减少查询,但仍然产生了问题。我希望第一个查询产生与第二个查询相同数量的结果,但事实并非如此 为什么此查询产生零结果:Sql 为什么这两个查询产生不同的结果?,sql,tsql,null,Sql,Tsql,Null,我正在试图找到申请表中没有的人数 我有两个表(person和application),其中person与application有一对多的关系(person.id=application.person)。但是,个人可能没有申请。应用程序表中大约有35K条记录。为了这篇文章,我能够减少查询,但仍然产生了问题。我希望第一个查询产生与第二个查询相同数量的结果,但事实并非如此 为什么此查询产生零结果: select count(*) from person p where (p.id not in (
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
))
据我理解,第二个问题是正确的,因为:
p.id不在null中
返回trueapp
p、 id不在p.id中
返回false有人能解释一下吗(非常感谢)?您不应该在子查询中使用
not in
。它不能正确处理NULL
值(或至少直观地处理)。相反,将查询表述为不存在
:
select count(*)
from person p
where not exists (select 1
from application a
where a.person = p.id
);
使用NOT IN
,如果子查询中的任何行返回NULL
,则不会向外部查询返回任何行
带有关联条款的版本限制了损坏。但是,我的建议是简单地使用
notexists
您不应该在子查询中使用notin
。它不能正确处理NULL
值(或至少直观地处理)。相反,将查询表述为不存在
:
select count(*)
from person p
where not exists (select 1
from application a
where a.person = p.id
);
使用NOT IN
,如果子查询中的任何行返回NULL
,则不会向外部查询返回任何行
带有关联条款的版本限制了损坏。然而,我的建议是简单地使用
notexists
根据@gordon linoff的响应,我在第一个查询的子查询中发现了null。根据@gordon linoff的响应,我在第一个查询的子查询中发现了null。