如果我们在SELECT
中有IF EXISTS
语句,那么一旦在表中找到记录,执行是否会立即停止?例如:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' )
return 1
else
return 0
如果表中存在名为= John的行,是否会停止执行并返回1或者是否遍历整个表以查找更多匹配项?
答案 0 :(得分:49)
是的,它会停止执行,因此通常优先于HAVING COUNT(*) > 0
,而这通常不会。
如果查看执行计划,EXISTS
将会看到table1
的实际行数不会超过1,而与匹配记录的数量无关。
在某些情况下,SQL Server可以在简化阶段将COUNT
查询的树转换为与EXISTS
相同的树(使用半连接,而不会看到聚合运算符){{ 3}}
对于比问题中显示的更复杂的子树,您偶尔会发现COUNT
的效果优于EXISTS
。因为半连接只需要从子树中检索一行,所以这可以鼓励一个带有嵌套循环的计划用于树的那一部分 - 这在实践中可能无法达到最佳效果。
答案 1 :(得分:-3)
在这种情况下不需要“其他”:
IF EXISTS(SELECT * FROM table1 WHERE Name='John' ) return 1
return 0