我需要从复杂的选择查询创建一些连接列,这是一个三个选择的联合
SELECT C1,C2, ... FROM Source1 UNION SELECT C1,C2,... FROM Source2 UNION SELECT C1,C2 from Source3
现在,我没有在所有三个select语句中重复我的新列的生成逻辑,而是考虑使用表变量来临时存储联合结果,并将我的列添加到表变量的select中.所以像
DECLARE @tv TABLE (C1 varchar(max), C2 varchar(max) . . .) INSERT INTO @tv SELECT C1,C2, ... FROM Source1 UNION SELECT C1,C2,... FROM Source2 UNION SELECT C1,C2 from Source3 SELECT C1, C2, CASE WHEN ... ELSE '' END CN FROM @tv
我已经阅读了有关使用表变量时要注意的性能注意事项.上面的查询有时可能会生成几千行,但在大多数情况下会生成几百行.在这种情况下切换到临时变量更好吗?UNION SELECT语句是否仍能并行运行?
将列生成逻辑放在一个位置是个好主意.我会用子查询来做到这一点:
SELECT s.*, (CASE WHEN ... ELSE '' END) as CN FROM (SELECT C1,C2, ... FROM Source1 UNION ALL SELECT C1,C2,... FROM Source2 UNION ALL SELECT C1,C2 from Source3 ) s;
注意:使用UNION ALL
而不是UNION
,除非您特别希望引发删除重复的开销.