我有一个包含多个语句和UNION ALL
的大型SQL查询。我现在正在做这样的事情:
DECLARE @condition BIT;
SET @condition = 0;
SELECT * FROM table1
WHERE @condition = 1;
UNION ALL
SELECT * FROM table2
在这种情况下,table1不会返回任何结果。但是,该查询很复杂,有很多连接(例如FullTextTable
)。执行计划的估计显示成本很高,但实际行数和执行时间似乎显示不同。这是过滤整个查询的最有效方法,还是有更好的方法?如果可能的话,我不希望第一个选择中的任何内容运行。
答案 0 :(得分:2)
我认为最终的SQL查询与所有依赖于预先计算的值的联合和条件变得非常复杂。如果您有兴趣降低查询的复杂性(不是为了机器而是为了维护目的),我会将单个查询移动到视图或表值函数中以将该逻辑移动到其他位置。然后,您可以使用其他地方建议的if @condition = 1
语法。
答案 1 :(得分:1)
我认为你可能会更好:
if (@condition=1)
begin
select * from table1
union all
select * from table2
end
else
begin
select * from table2
end
答案 2 :(得分:1)
解决此问题的最佳方法是使用动态SQL。 DForck解决方案的问题在于它可能导致参数嗅探。只是为了给出一个粗略的想法,您的查询可能看起来像这样
DECLARE @query VARCHAR(MAX);
IF(@condition = 0) SET @query ='SELECT * FROM table1 UNION ALL'
SET @query = @query +'SELECT * FROM table2'
sp_executesql @query
这只是一个简化的案例,但在实际实现中,您将参数化动态查询,这将解决参数嗅探的问题。以下是关于此问题的出色解释Parameter Sniffing (or Spoofing) in SQL Server