当前位置:  开发笔记 > 编程语言 > 正文

SQL Server - 表变量与具有union的select语句的临时表

如何解决《SQLServer-表变量与具有union的select语句的临时表》经验,为你挑选了1个好方法。

我需要从复杂的选择查询创建一些连接列,这是一个三个选择的联合

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语句是否仍能并行运行?



1> Gordon Linof..:

将列生成逻辑放在一个位置是个好主意.我会用子查询来做到这一点:

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,除非您特别希望引发删除重复的开销.


更准确地说,这是一个派生表.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有