EXISTS 子句在 SQL Server 中如何工作?

Posted

技术标签:

【中文标题】EXISTS 子句在 SQL Server 中如何工作?【英文标题】:How does the EXISTS Clause work in SQL Server? 【发布时间】:2016-01-29 09:54:19 【问题描述】:

我尝试了以下查询,但对 EXISTS 子句的工作有点困惑,尽管我知道它的计算结果为 TRUE/FALSE

#1 SQL 子查询以下无论如何返回 0,但组合查询的结果仍然是 1。

1. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 )

2. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 )

另外,如果EXISTS 子句评估为TRUE/FALSE,那么为什么下面的子句不起作用?

SELECT 1 WHERE EXISTS ( 1 )

请帮助我了解这种情况。

编辑: EXISTS 子句评估为 TRUE/FALSE。 如果子查询返回任何结果,则条件为TRUE。那为什么EXISTS ( 1 ) 不起作用?这是一个TRUE 条件。

【问题讨论】:

如果EXISTS' 子选择返回任何行,EXISTS 就是TRUE。 (返回的值无关紧要,只要返回任何行。) 另一种解决方案可以使用@@rowcount系统变量IF @@rowcount > 1,其中包含受影响或读取的行数 How do SQL EXISTS statements work?的可能重复 @PathumAnjana,请查看编辑。 谢谢@jarlh。现在我明白了。 【参考方案1】:

来自文档EXISTS:

指定一个子查询来测试是否存在行。

SELECT 1 
WHERE EXISTS ( SELECT 0 WHERE 1 = 1 )
-- there is row

SELECT 1 
WHERE EXISTS ( SELECT 0 WHERE 1 = 0 )
-- no row returned by subquery

SELECT 1 WHERE EXISTS ( 1 )
-- not even valid query `1` is not subquery

请记住,它检查的是行而不是值:

SELECT 1 
WHERE EXISTS ( SELECT NULL WHERE 1 = 1 )
-- will return 1

LiveDemo

编辑:

这似乎与“EXISTS 子句评估为真/假”这句话矛盾?

EXISTS 运算符测试是否存在行并返回 TRUE/FALSE

所以如果子查询返回:

╔══════════╗     ╔══════════╗     ╔══════════╗     ╔══════════╗
║ subquery ║     ║ subquery ║     ║ subquery ║     ║ subquery ║
╠══════════╣     ╠══════════╣     ╠══════════╣     ╠══════════╣
║ NULL     ║     ║ 1        ║     ║ 0        ║     ║anything  ║
╚══════════╝     ╚══════════╝     ╚══════════╝     ╚══════════╝

然后EXISTS (subquery) -> TRUE

如果子查询返回(无行):

╔══════════╗
║ subquery ║
╚══════════╝

然后EXISTS (subquery) -> FALSE

【讨论】:

现在我明白了,它检查的是行而不是值。这似乎与“EXISTS 子句评估为真/假”这句话矛盾?【参考方案2】:

当其中的子查询有任何行时,EXISTS 返回 true。重写 EXISTS 表达式的逻辑等效(但不推荐)方法是:

SELECT 1
WHERE (SELECT COUNT(*) FROM (SELECT 0 WHERE 1 = 1)) > 0

在此重写中,您的最后一个查询如下所示:

SELECT 1
WHERE (SELECT COUNT(*) FROM 1) > 0

你应该看到的没有意义。

【讨论】:

【参考方案3】:

行为:

Condition          Is true if ...
----------         ------------------
EXISTS             the subquery returns at least one row
NOT EXISTS         the subquery returns no data

用法:

WHERE EXISTS ( subquery );
WHERE NOT EXISTS  ( subquery );

【讨论】:

以上是关于EXISTS 子句在 SQL Server 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

EXISTS 子句的 SQL Server 查询提示

SQL Server 查询表值参数的短路 EXISTS 语句

SQL Server查询表值参数的短路EXISTS语句

Sql server not in优化

SQL Group By and Have 子句和 exists 子句

Oracle where exists 子句不适用于 SQL Plus