Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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_Subquery_Sql Server 2016 - Fatal编程技术网

返回奇怪结果的SQL子查询

返回奇怪结果的SQL子查询,sql,sql-server,subquery,sql-server-2016,Sql,Sql Server,Subquery,Sql Server 2016,我正在用MS SQL编写一个非常简单的子查询,返回意外的结果。我想返回的是一个存在于某个时间段但不存在于另一个时间段的账号列表。粘贴在下面的初始查询返回了零行,这是意外的 select name1.acct from sym.dbo.name as name1 where name1.processdate = 20171130 and name1.type = 0 and name1.acct not in ( select

我正在用MS SQL编写一个非常简单的子查询,返回意外的结果。我想返回的是一个存在于某个时间段但不存在于另一个时间段的账号列表。粘贴在下面的初始查询返回了零行,这是意外的

select
    name1.acct
from
    sym.dbo.name as name1
where
    name1.processdate = 20171130
    and name1.type = 0
    and name1.acct not in
    (
    select 
        name2.acct
    from 
        sym.dbo.name as name2
    where
        name2.type = 0
        and name2.processdate = 20171031
    )
但是,当我向子查询添加一行额外的逻辑并执行时,预期的结果将返回给我,请参见下文

select
    name1.acct
from
    sym.dbo.name as name1
where
    name1.processdate = 20171130
    and name1.type = 0
    and name1.acct not in
    (
    select 
        name2.acct
    from 
        sym.dbo.name as name2
    where
        name2.type = 0
        and name2.processdate = 20171031
        and name2.acct <> '8888888'
    )
最初我认为它可能与数据类型有关,所以我尝试使用convert而不是cast将acct编号转换为varchar和int,结果相同。有人能解释一下为什么查询一返回零结果,查询二返回预期结果吗

我正在使用Microsoft SQL Management Studio 2016

谢谢

不要在中使用NOT,尤其是在子查询中。它的行为不像预期的那样——正如您刚刚了解到的那样。问题出在哪里?如果子查询返回的任何值为NULL,则NOT IN会过滤掉所有内容

相反,不存在以下用途:

不要使用NOT IN,尤其是在子查询中。它的行为不像预期的那样——正如您刚刚了解到的那样。问题出在哪里?如果子查询返回的任何值为NULL,则NOT IN会过滤掉所有内容

相反,不存在以下用途:


可以显示示例数据来验证在两个查询上看到的结果吗?您应该考虑使用日期或DATETIME数据类型来定义日期而不是int。可以显示示例数据来验证在两个查询上看到的结果吗?您应该考虑使用日期或DATETIME数据类型来定义日期而不是int。
where name1.processdate = 20171130 and
      name1.type = 0 and
      not exists (select 1
                  from sym.dbo.name name2
                  where name2.acct = name1.acct and
                        name2.processdate = 20171031
                 );