【问题标题】:Can I combine values from multiple rows in another table into multiple columns of one row using SQL?我可以使用 SQL 将另一个表中多行的值组合成一行的多列吗?
【发布时间】:2011-05-30 08:56:29
【问题描述】:

我有两张桌子: 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,但我也对其他数据库软件的解决方案感兴趣。

感谢您的帮助!

【问题讨论】:

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


    【解决方案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 取别名(这就是 t2_1 和 t2_2 - 一种区分加入的 T2 的两个实例的方法)。

    【讨论】:

      【解决方案2】:

      这与@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 
      

      我只发布一个单独的答案,因为 cmets as you get told here 中没有代码格式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 2021-02-25
        • 2019-01-24
        相关资源
        最近更新 更多