【问题标题】:SQL Server: efficient way to combine two columns to distinct values?SQL Server:将两列组合为不同值的有效方法?
【发布时间】:2017-04-18 12:59:53
【问题描述】:

这是一个性能问题,我想将两个单独表中的两列组合起来。怎么组合?

我将其理解为or 条件

SELECT a.contract1 or b.contract2 from TABLE1 a, TABLE2 b

我的目标是获得单个列,其中每个元素位于 Table1 的 Contract1 或 Table2 的 Contract2 中。 or 表示法不区分不同的值和其他值。我需要不同的价值观。所提出的解决方案,联合方法,由于底层的不同,在处理超过许多 GB 的大型数据集时运行缓慢。

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

输入

表 A 中的列

1
2
3

表 B 中的 Golumn

1
3
5

想要的输出

1
2
3
5

【问题讨论】:

标签: sql-server performance sqlperformance


【解决方案1】:

UNION 就是这样做的

SELECT contract1 FROM TABLE1
UNION
SELECT contract2 FROM TABLE2

编辑

您在评论中所说的性能问题可能是由UNION 本身的性质引起的;幕后发生的事情是 dbms 分别执行这两个语句,然后在结果集上应用 distinct。在大型表上,这后一步可能会导致整体性能出现问题,您可以通过切换到UNION ALL(不会执行distinct)来确认这一点。

如果您不能满足于UNION ALL,因为您不想重复,我发现this interesting article 为此类问题提出了解决方案。它涉及到表变量的使用,您使用两个语句填充该变量,并从您选择的位置获取最终结果。

基本上步骤是

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

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

【讨论】:

  • @hhh 注意:Union all 不会执行 distinct 因此 1 和 3 会重复。有时你想要这个。既然你不知道 union,我想确保你知道 union all。
猜你喜欢
  • 2016-11-02
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2018-03-04
  • 2014-10-02
  • 2023-01-28
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多