SQL服务器:将两列组合成不同值的有效方法?
SQL Server: efficient way to combine two columns to distinct values?
这是一个性能问题,我想合并两个单独表中的两列。怎么组合呢?
我将此理解为 or
条件
SELECT a.contract1 or b.contract2 from TABLE1 a, TABLE2 b
我的目标是获得单个列,其中每个元素位于 Table1 的 Contract1 或 Table2 的 Contract2 中。 or
表示法不区分不同的值和其他值。我需要不同的价值观。所提出的解决方案,联合方法,由于底层的不同,对超过许多 GB 的大型数据集表现缓慢。
请提出有效的处理方法。
输入
Column in Table A
1
2
3
Golumn in Table B
1
3
5
想要输出
1
2
3
5
这就是 UNION
所做的
SELECT contract1 FROM TABLE1
UNION
SELECT contract2 FROM TABLE2
编辑
您在评论中提到的性能问题可能是由 UNION
本身的性质引起的;幕后发生的事情是 dbms 分别执行这两个语句,然后在结果集上应用 distinct
。在大型 table 上,后一步可能会导致整体性能出现问题,您可以通过切换到 UNION ALL
(不会执行 distinct
)来确认这一点。
如果您不能满足于 UNION ALL
,因为您不想重复,我发现 this interesting article 提出了针对此类问题的解决方案。它涉及 table 变量的使用,您可以用两个语句填充该变量,并从中 select 获得最终结果。
基本上步骤是
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
但是您可以在上面的 link 中找到更详细的解释
这是一个性能问题,我想合并两个单独表中的两列。怎么组合呢?
我将此理解为 or
条件
SELECT a.contract1 or b.contract2 from TABLE1 a, TABLE2 b
我的目标是获得单个列,其中每个元素位于 Table1 的 Contract1 或 Table2 的 Contract2 中。 or
表示法不区分不同的值和其他值。我需要不同的价值观。所提出的解决方案,联合方法,由于底层的不同,对超过许多 GB 的大型数据集表现缓慢。
请提出有效的处理方法。
输入
Column in Table A
1 2 3
Golumn in Table B
1 3 5
想要输出
1
2
3
5
这就是 UNION
所做的
SELECT contract1 FROM TABLE1
UNION
SELECT contract2 FROM TABLE2
编辑
您在评论中提到的性能问题可能是由 UNION
本身的性质引起的;幕后发生的事情是 dbms 分别执行这两个语句,然后在结果集上应用 distinct
。在大型 table 上,后一步可能会导致整体性能出现问题,您可以通过切换到 UNION ALL
(不会执行 distinct
)来确认这一点。
如果您不能满足于 UNION ALL
,因为您不想重复,我发现 this interesting article 提出了针对此类问题的解决方案。它涉及 table 变量的使用,您可以用两个语句填充该变量,并从中 select 获得最终结果。
基本上步骤是
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
但是您可以在上面的 link 中找到更详细的解释