如何修改SQL查询避免IF EXISTS判断时重复执行相同SELECT语句
优化方案
可以直接通过两种方案改写,完全等价原有逻辑的同时,避免重复查询[MyTable]中Property=1的记录:
方案1:变量缓存查询条件(可读性更强,逻辑清晰)
DECLARE @TargetProperty INT IF EXISTS(SELECT 1 FROM [MyTable] WHERE Property=1) BEGIN SET @TargetProperty = 1 END ELSE BEGIN SELECT @TargetProperty = Property FROM [OtherTable] WHERE OtherProperty = 1 END -- 仅执行一次目标表查询返回结果 SELECT * FROM [MyTable] WHERE Property = @TargetProperty
小优化点:
EXISTS判断中用SELECT 1替代SELECT *,可以减少不必要的字段扫描开销,判断逻辑完全一致。
方案2:单查询合并条件(无需分支,代码更简洁)
也可以直接把逻辑合并到一次SELECT语句中,不需要分支判断:
SELECT * FROM [MyTable] WHERE Property = 1 OR ( NOT EXISTS(SELECT 1 FROM [MyTable] WHERE Property=1) AND Property = (SELECT Property FROM [OtherTable] WHERE OtherProperty = 1) )
额外提示:如果
[OtherTable]中OtherProperty=1可能匹配到多条记录,建议给子查询加上TOP 1或者MAX()等聚合函数,避免子查询返回多值触发运行报错。
内容的提问来源于stack exchange,提问作者Mario Levrero
相关产品推荐
相关产品推荐

