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 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 查询表值参数的短路 EXISTS 语句