为什么这两个查询会产生不同的结果



我正在尝试找到不在应用表中的人数。

我有两个表( 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 
))

根据我的理解,第二个查询是正确的,因为:

  1. 当人没有应用程序时,内部选择返回null p.id not in null返回true
  2. 当人拥有应用程序时,内部选择返回应用程序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

相关内容

  • 没有找到相关文章

最新更新