SQL查询在中选择并选择不在中
有人知道为什么下面两个查询的结果加起来与第三个查询的结果不一致吗SQL查询在中选择并选择不在中,sql,sql-server,Sql,Sql Server,有人知道为什么下面两个查询的结果加起来与第三个查询的结果不一致吗 SELECT COUNT(leadID) FROM leads WHERE makeID NOT IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHERE uploadID = 3 AND uploadRowID = 1) AND modelID NOT IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHE
SELECT COUNT(leadID) FROM leads
WHERE makeID NOT IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHERE uploadID = 3 AND uploadRowID = 1)
AND modelID NOT IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHERE uploadID = 3 AND uploadRowID = 2)
SELECT COUNT(leadID) FROM Leads
WHERE makeID IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHERE uploadID = 3 AND uploadRowID = 1)
OR modelID IN (SELECT uploadDataMapID FROM DG_App.dbo.uploadData WHERE uploadID = 3 AND uploadRowID = 2)
SELECT COUNT(leadID) FROM Leads
第一个查询是我需要的计数。第二个是根据DG_App.dbo.uploadData表的内容告诉用户有多少记录被抑制。第三个查询只是对所有记录的直接计数
当我运行这些查询时,查询1的结果+查询2的结果比整个表的计数少了大约46K条记录。我用()对WHERE语句进行了分组,但这根本没有改变计数
这是MSSQL Server 2012
在这方面的任何投入都将是巨大的
谢谢你有空值吗?他们不会出现在第一次,也不会出现在第二次,我想你错过了这些
SELECT Count(leadID) FROM Leads WHERE makeID is Null or modelID is null
编辑:我必须添加更多的注意事项:因为存在AND和OR条件,所以事情变得更复杂了
- ()中的Null始终被计算为Null,不会出现行
- Null NOT IN()始终计算为Null,不会显示行
- Null,并且某些内容被评估为Null或False,则不会出现行
- Null或某物被评估为真如果某物是真,否则被评估为Null,只会出现一些行
- 如果
和makeID
都为空,则会丢失记录:modelID
SELECT Count(leadID) FROM Leads WHERE makeID is Null and modelID is null
- 但您也会错过
为Null,并且makeID
不为Null且不在第二个子查询中的记录:modelID
SELECT Count(leadID) FROM Leads WHERE makeID is Null AND modelID NOT IN (...)
SELECT Count(leadID) FROM Leads WHERE makeID is NOT IN (...) AND modelID is Null
- 以及
为空且modelID
不在第一个子查询中的那些:makeID
SELECT Count(leadID) FROM Leads WHERE makeID is Null AND modelID NOT IN (...)
SELECT Count(leadID) FROM Leads WHERE makeID is NOT IN (...) AND modelID is Null
- 这里有一些解释
-- sample tables to discuss
create table innotintest (a int);
insert into innotintest values (1),(2),(3),(4),(null);
create table other (b int);
insert into other values (2),(3);
create table other1 (c int);
insert into other1 values (2),(3),(null);
select * from innotintest where a not in (select b from other); -- RESULT = 1,4
select * from innotintest where a in (select b from other); -- RESULT = 2,3
--Overall outcome : Record with a=NULL is missing. It is neither IN nor NOT IN
select * from innotintest where a not in (select c from other1); -- RESULT = (none!)
select * from innotintest where a in (select c from other1); -- RESULT = 2,3
--Overall outcome : Record with a=NULL is missing
-- Moreover, when other1 contains NULL values,
-- NOTHING is returned for NOT IN
重申守则中的意见
也不是()中的
不在(…)
集合中包含空值,则与筛选器不匹配我可以想到三个例子:
- uploadDataMapID的uploadID不等于3
- uploadDataMapID的uploadRowID不等于1或2
- leads表中有空的makeID或modelID条目
从makeID为NULL或modelID为NULL的Lead中选择count(leadID)
SELECT count(leadID)
FROM leads AS l INNER JOIN DG_App.dbo.uploadData AS u ON l.makeID = u.uploadDataMapID
WHERE u.uploadID <> 3 OR u.uploadRowID <> 1
SELECT count(leadID)
FROM leads AS l INNER JOIN DG_App.dbo.uploadData AS u ON l.modelID = u.uploadDataMapID
WHERE u.uploadID <> 3 OR u.uploadRowID <> 2
选择计数(leadID)
从leads作为l内部连接DG_App.dbo.uploadData作为l.makeID=u.uploadDataMapID上的u
其中u.uploadID 3或u.uploadRowID 1
选择计数(leadID)
从leads作为l内部连接DG_App.dbo.uploadData作为l.modelID=u.uploadDataMapID上的u
其中u.uploadID 3或u.uploadRowID 2
这三个查询应该为您提供丢失的记录。您有一些错误:
NULL和FALSE
计算结果为FALSE
。NULL或FALSE
计算结果为NULL
@ypercube非常感谢您的评论,我修正了我的答案