Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么这两个查询产生不同的结果?_Sql_Tsql_Null - Fatal编程技术网

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

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 (

我正在试图找到申请表中没有的人数

我有两个表(person和application),其中person与application有一对多的关系(person.id=application.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 
))
据我理解,第二个问题是正确的,因为:

  • 当person没有应用程序时,内部选择返回null,其中
    p.id不在null中
    返回true
  • 当个人拥有应用程序时,内部选择返回应用程序p.id,其中
    app
    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。