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