Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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_Sql Server - Fatal编程技术网

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,并且某些内容被评估为NullFalse,则不会出现行
  • Null或某物被评估为如果某物是,否则被评估为Null,只会出现一些行
这意味着在前两个查询中,有些记录的空值已经被统计,而其他记录则没有。这就是你所错过的:

  • 如果
    makeID
    modelID
    都为空,则会丢失记录:

    SELECT Count(leadID) FROM Leads WHERE makeID is Null and modelID is null
    
  • 但您也会错过
    makeID
    为Null,并且
    modelID
    不为Null且不在第二个子查询中的记录:

    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
      
      重申守则中的意见

    • NULL既不是()中的
      也不是()中的
    • 如果
      不在(…)
      集合中包含空值,则与筛选器不匹配

    • 我可以想到三个例子:

      • 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非常感谢您的评论,我修正了我的答案