我可以使用SQL将另一个表中多行的值组合成一行的多列吗?

时间:2010-12-24 10:34:46

标签: sql sql-server-2008 sql-server-2008-r2

我有两张桌子: T1:

| M_ID | P_ID1 | P_ID2 | rest of T1 columns |
|  0   |   0   |   1   |         ...        |
|  1   |   2   |   3   |         ...        |

T2:

| P_ID | Type | A | B |
|  0   |   1  | a | e |
|  1   |   2  | b | f |
|  2   |   1  | c | g |
|  3   |   2  | d | h |

现在,我希望有一个选择此选项的查询:

| M_ID | P_1a | P_1b | P_2a | P_2b | rest of T1 columns |
|  0   |  a   |  e   |  b   |  f   |         ...        |
|  1   |  c   |  g   |  c   |  h   |         ...        |

所以,在单词中:我想从T1中选择所有列,但我想用T2中的列替换P_ID1,其中P_ID等于P_ID1,类型为1,P_ID2基本相同。

我显然可以通过多个查询获取所需的信息,但我想知道是否有一种方法可以通过一个查询来完成此操作。有什么想法吗?

我目前正在使用SQL Server 2008r2,但我也对其他数据库软件的解决方案感兴趣。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

当然,您只需要使用联接:

select T1.M_ID, t2_1.A as P_1a, t2_1.B as P_1b, t2_2.A as P_2a, t2_2.B as P_2b, ...
from T1, T2 t2_1, T2 t2_2
where T1.P_ID1 = t2_1.P_ID and T1.P_ID2 = t2_2.P_ID 

基本上我们将T1连接到T2两次,一次用于P_1值,第二次用于P_2值。当你加入两次以区分两者时,你需要使用别名T2(这就是t2_1和t2_2之间的区别 - 一种区分连接T2的两个实例的方法)。

答案 1 :(得分:1)

这与仅使用现代连接语法的@John Pickup解决方案相同:

select T1.M_ID, t2_1.A as P_1a, t2_1.B as P_1b, t2_2.A as P_2a, t2_2.B as P_2b, ...
from T1
     join T2 t2_1 on T1.P_ID1 = t2_1.P_ID 
     join T2 t2_2 on T1.P_ID2 = t2_2.P_ID 

我只发布一个单独的答案,因为评论as you get told here

中没有代码格式