SQL Server:将两列组合成不同值的有效方法?

hhh*_*hhh 0 sql-server performance sqlperformance

这是一个性能问题,我希望将两个独立的表中的两列组合在一起.你怎么做组合?

我理解这是or条件

SELECT a.contract1 or b.contract2 from TABLE1 a, TABLE2 b
Run Code Online (Sandbox Code Playgroud)

我的目标是获得一个列,其中每个元素都在Table1的Contract1或Table2的Contract2中.该or符号不重复值等数值进行区分.我需要不同的价值观.由于底层不同,所提出的解决方案union方法对于大量数据集而言行动缓慢.

请提出有效的方法来处理性能.

输入

表A中的列

1
2
3
Run Code Online (Sandbox Code Playgroud)

表B中的Golumn

1
3
5
Run Code Online (Sandbox Code Playgroud)

想要输出

1
2
3
5
Run Code Online (Sandbox Code Playgroud)

Ste*_*ini 5

那是什么UNION

SELECT contract1 FROM TABLE1
UNION
SELECT contract2 FROM TABLE2
Run Code Online (Sandbox Code Playgroud)

编辑

您在评论中谈到的性能问题可能是由于其UNION本身的性质造成的; 幕后发生的事情是dbms分别执行两个语句然后distinct在结果集上应用a .在大型桌子上,后一步骤可能会导致整体性能出现问题,您可以通过切换到UNION ALL(不会执行distinct)来确认.

如果你不能满足UNION ALL,因为你不想要重复,我发现这篇有趣的文章提出了解决这类问题的方法.它涉及到表变量的使用,您可以使用两个语句填充,也可以从中选择以获取最终结果.

基本上是步骤

DECLARE @Result TABLE (
  Contract varchar(50)
  — Example of how to declare a PK within a table variable
  PRIMARY KEY ( Contract )
)

INSERT @Result
SELECT Contract1
FROM Table1

INSERT @Result
SELECT Contract2
FROM Table2

SELECT *
FROM @Result
Run Code Online (Sandbox Code Playgroud)

但您可以在上面的链接中找到更详细的解释

  • @hhh注意:`Union all`不会执行不同的,因此1和3将重复.有时你想要这个.既然你不知道工会我想确保你知道工会的全部. (3认同)