Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 为什么这个“不在”条款没有达到我的期望?_Sql Server_Ssms - Fatal编程技术网

Sql server 为什么这个“不在”条款没有达到我的期望?

Sql server 为什么这个“不在”条款没有达到我的期望?,sql-server,ssms,Sql Server,Ssms,我正在使用not in运算符编写我认为应该是一个简单的查询,但它并没有达到我所期望的效果 背景: 我有两张桌子,联系人和同伴。 Contact包括ContactID栏、person's identity栏和CompanyID栏,其中ContactID栏是联系人的身份和所在公司的名称 公司ID值应与公司表中的公司ID相等 我想写一个查询,检查联系人表中有多少人的CompanyID无效,即,被列为在不在Company表中的公司工作 我有一个可执行此操作的工作查询: select count(

我正在使用not in运算符编写我认为应该是一个简单的查询,但它并没有达到我所期望的效果

背景:

我有两张桌子,联系人和同伴。 Contact包括ContactID栏、person's identity栏和CompanyID栏,其中ContactID栏是联系人的身份和所在公司的名称 公司ID值应与公司表中的公司ID相等 我想写一个查询,检查联系人表中有多少人的CompanyID无效,即,被列为在不在Company表中的公司工作 我有一个可执行此操作的工作查询:

select
    count(ContactID)
from
    Contact left join Company on Contact.CompanyID = Company.CompanyID
where
    Company.CompanyID is null;
这个查询返回值2725538,我相信这是正确的答案。我已经做了一些简单的调试,显示了前10行的调试,它似乎正在计算正确的行数

我编写了第二个查询,希望返回相同的结果:

select
    count(ContactID)
from
    Contact
where
    CompanyID not in
        (select
            CompanyID
        from
            Company)
但是,此查询返回0

为了帮助我调试这个,我检查了另外两个查询

首先,我试着注释WHERE子句,该子句应提供所有ContactID,无论它们是否为无效公司工作:

select
    count(ContactID)
from
    Contact
此查询返回29722995

第二,我尝试从我的查询中删除NOT,这应该与我正在寻找的相反,也就是说,它应该计算为有效公司工作的联系人:

select
    count(ContactID)
from
    Contact
where
    CompanyID in
        (select
            CompanyID
        from
            Company)
此查询返回26997457

值得注意的是,这两个数字的差异正好是2725538,即第一个工作查询返回的数字。如果我的第二个查询有效,这就是我所期望的。联系人总数减去其公司ID在公司表中的联系人数,应该等于其公司ID不在公司表中的联系人数,不是吗


那么,为什么查询的not in版本返回0而不是正确答案?

唯一的问题可能是空的CompanyID。由于NULL的不可比较性,Not In不适用于NULL

请尝试以下操作:

select
    count(ContactID)
from
    Contact
where
    CompanyID not in
        (select
            ISNULL(CompanyID,'')
        from
            Company)
您可以在dbfiddle中看到这个示例


请查找更多详细信息。

唯一的问题可能是空公司ID。由于NULL的不可比较性,Not In不适用于NULL

请尝试以下操作:

select
    count(ContactID)
from
    Contact
where
    CompanyID not in
        (select
            ISNULL(CompanyID,'')
        from
            Company)
您可以在dbfiddle中看到这个示例


请查找更多详细信息。

谢谢,这是正确的,如果我将整个WHERE子句替换为WHERE CompanyID为NULL,则问题肯定为NULL。我得到了正确的答案,但此答案中的查询仍返回0。我想问题可能是我的联系人表中有空值,而不是公司表中的空值?我将进行更多故障排除。选择。。。从…起其中companyid不为null且不在选择中。。。如果companyid不为null,则将从两个表中消除null,并提供查询之间的苹果对苹果比较;我只需要将ISNULL应用于CompanyID的第一个实例,而不是notin子句中的实例,因为导致问题的null是Contact表中的null。接受这个,因为它让我找到了正确的答案。谢谢@A_S00 gr8,你知道了。谢谢你接受答案。谢谢,这是正确的,如果我用WHERE CompanyID is NULL替换我的整个WHERE子句,问题肯定是NULL。我得到了正确的答案,但是这个答案中的查询仍然返回0。我想问题可能是我的联系人表中有空值,而不是公司表中的空值?我将进行更多故障排除。选择。。。从…起其中companyid不为null且不在选择中。。。如果companyid不为null,则将从两个表中消除null,并提供查询之间的苹果对苹果比较;我只需要将ISNULL应用于CompanyID的第一个实例,而不是notin子句中的实例,因为导致问题的null是Contact表中的null。接受这个,因为它让我找到了正确的答案。谢谢@A_S00 gr8,你知道了。谢谢你接受答案。