如果我们在 IF EXISTS
中有一个 SELECT
语句,那么执行会在找到表中的一条记录后立即停止吗?例如:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' )
return 1
else
return 0
如果表中存在一个名字为 John 的行,它会停止执行并返回 1 吗?还是会遍历整个表查找更多匹配项?
如果我们在 IF EXISTS
中有一个 SELECT
语句,那么执行会在找到表中的一条记录后立即停止吗?例如:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' )
return 1
else
return 0
如果表中存在一个名字为 John 的行,它会停止执行并返回 1 吗?还是会遍历整个表查找更多匹配项?
是的,它会停止执行,因此通常比 HAVING COUNT(*) > 0
更可取,后者经常不起作用。
使用 EXISTS
,如果查看执行计划,会发现从 table1
中输出的实际行数不会超过1,无论匹配记录的数量如何。
在某些情况下,SQL Server 可以在简化阶段将 COUNT
查询的树转换为与 EXISTS
相同的树(使用半连接并且没有聚合运算符),这里的评论中讨论了一个例子。
对于比问题中显示的更复杂的子树,偶尔可能会发现 COUNT
比 EXISTS
执行得更好。因为半连接只需要从子树中检索一行,所以这可能会鼓励使用嵌套循环的计划,但在实践中可能不是最优选择。
SELECT TOP 1 * FROM t1 WHERE xxx ORDER BY some_condition_that_would_mean_yyyy_would_be_first
,然后检查结果。 - Martin Smith在这种情况下不需要使用“else”:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' ) return 1
return 0
SELECT 1
执行此操作,因为这里的图表和示例显示了由于列权限而失败的"SELECT 1" 链接。 - Martin Smith