有没有更好的方法将表中的多个列值连接到另一个?

时间:2019-11-26 16:26:34

标签: sql sql-server

我有一个这样的表(table2):

   JoinID ID Value
   1234     1  101
   1234     2  102
   1234     3  103
   1234     4  104

我想将其连接到另一个表(table1),所以我有一行具有特定ID的列,例如:

JoinID ID_1 ID_2 ID_3 OtherStuffFromOthertables
1234   101  102  103  123456789

我目前正在通过这样的多个联接来做到这一点:

LEFT JOIN table2 t2 ON t2.JoinID = t1.JoinID and ID = 1
LEFT JOIN table2 t3 ON t3.JoinID = t1.JoinID and ID = 2
LEFT JOIN table2 t4 ON t4.JoinID = t1.JoinID and ID = 3

这是可行的,但是我觉得比做一堆联接有更好的方法。有什么我想念的东西可以使这个清洁器更快一点吗?

1 个答案:

答案 0 :(得分:0)

您的方法很好。另一种方法是条件聚合:

select t1.JoinId,
       max(case when t2.id = 1 then t2.value end) as value_1,
       max(case when t2.id = 2 then t2.value end) as value_2,
       max(case when t2.id = 3 then t2.value end) as value_3
from table1 t1 left join
     table2 t2
     on t2.JoinID = t1.JoinId
group by t1.JoinId;

随着列数的增加,这将具有更好的性能(通常)。但是,如果性能是一个问题,您可能想看看哪个更好。

实际上,在SQL Server中,最佳性能可能是使用outer apply的混合:

select t1.JoinId, t2.*
from table1 t1 outer apply
     (select max(case when t2.id = 1 then t2.value end) as value_1,
             max(case when t2.id = 2 then t2.value end) as value_2,
             max(case when t2.id = 3 then t2.value end) as value_3
      from table2 t2
      where t2.JoinID = t1.JoinId
     ) t2;

这避免了对完整数据的聚合-选择每行较小的聚合。它还仅引用一次table2,并且可以最大程度地利用table2(JoinId, id, value)上的索引。