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 - Fatal编程技术网

Sql 存在和条件之间的差异在哪里

Sql 存在和条件之间的差异在哪里,sql,sql-server,Sql,Sql Server,我对Where子句中的条件和存在与不存在之间的区别有疑问。我知道当我使用第一种或第二种方法时不会得到相同的结果,但有人愿意解释为什么吗 比如说, SELECT ACCOUNT_NO, CLIENT_NAME FROM ACCOUNT a LEFT JOIN CLIENT b ON a.ACCOUNT_NO = b.ACCOUNT_NO WHERE ACCOUNT_TYPE NOT IN ( 'A', 'B', 'C' ) 及 ?

我对Where子句中的条件和存在与不存在之间的区别有疑问。我知道当我使用第一种或第二种方法时不会得到相同的结果,但有人愿意解释为什么吗

比如说,

SELECT ACCOUNT_NO,
       CLIENT_NAME
FROM   ACCOUNT a
       LEFT JOIN CLIENT b
              ON a.ACCOUNT_NO = b.ACCOUNT_NO
WHERE  ACCOUNT_TYPE NOT IN ( 'A', 'B', 'C' ) 

?


希望您理解我的意思,表ACCOUNT\u DET的字段与ACCOUNT几乎相同,但这是一个比我使用的查询更简化的查询。

这些查询完全不同

让我们忽略与客户机的左连接,这在两种情况下都是相同的

第一个查询可以描述为:

返回类型不是A、B或C的所有帐户

第二个问题:

如果内部查询(ACCOUNT_DET和ACCOUNT之间)未返回任何行,则返回ACCOUNT中的每条记录。若内部查询的结果至少有一行,则不返回任何内容

因此,本质上,存在被评估为真或假。它相当于以下查询之一:

-- no rows returned by the inner query
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO
Where NOT <false condition>

-- At least one row returned by the inner query
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO
Where NOT <true condition>
请注意,内部查询如何使用主查询中定义的别名“A”,因此每个外部行都可以与内部查询相关

哪一个更好?
但是,这也可以通过连接来实现。出于可读性和性能原因,我建议避免使用内部查询,因为联接可以完成这项工作。

您的子查询不相关。这意味着如果子查询中有任何行,外部查询将不会返回任何行。使用这种方法时,您需要将子查询与外部查询关联起来。存在vs IN我明白您的意思,假设我将查询更改为子查询,说明哪里存在,而不是不存在,这将如何更改我得到的结果?我只是想了解这两个子句之间的区别,如果你愿意,你可以忽略查询。你不会得到相同的结果,因为其中一个你甚至没有查询相同的表。
-- no rows returned by the inner query
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO
Where NOT <false condition>

-- At least one row returned by the inner query
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO
Where NOT <true condition>
select * from ACCOUNT A
where EXISTS( select * from ACCOUNT_DET D WHERE D.ACCOUNT_TYPE = A.ACCOUNT_TYPE)