Sql 存在和条件之间的差异在哪里
我对Where子句中的条件和存在与不存在之间的区别有疑问。我知道当我使用第一种或第二种方法时不会得到相同的结果,但有人愿意解释为什么吗 比如说,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' ) 及 ?
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)