【发布时间】:2017-01-26 13:18:47
【问题描述】:
我需要从一个复杂的选择查询中创建一些连接列,该查询是三个选择的联合
SELECT C1,C2, ... FROM Source1
UNION
SELECT C1,C2,... FROM Source2
UNION
SELECT C1,C2 from Source3
现在,我没有在所有三个选择语句中重复我的新列的生成逻辑,而是考虑使用表变量来临时存储联合结果并将我的列添加到从表变量中选择的列中。所以像
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 语句是否仍然能够并行运行?
【问题讨论】:
-
除非你有谓词,否则我看不到问题
-
为什么不只使用 CTE,甚至是视图?
-
此查询在存储过程中,因此视图不起作用
-
如果我唯一的选择是临时表或表变量,我会选择临时表,除非数据集非常小并且我没有加入任何其他表。 table variables vs temp tables - Richard Douglas.
标签: sql sql-server sql-server-2008