SQL Server - 连接表,使多行变成一行

Posted

技术标签:

【中文标题】SQL Server - 连接表,使多行变成一行【英文标题】:SQL Server - Join tables so multiple rows become one row 【发布时间】:2019-03-11 13:36:29 【问题描述】:

我正在尝试创建一个合并两个表的 Join 语句,一个用于员工信息,另一个用于工作角色信息。表结构如下:

表 1

表 2

我想以这样的方式连接这两个表,即 JobKey 和 JobValue 与关联的员工是同一行,而不是创建重复的行。通常,连接语句会创建这样的:

相反,我想要的是这样的:

有没有有效的方法来做到这一点?

编辑: 这是我目前用来加入他们的查询:

select * from testTable1 as a left join testTable2 as b on a.EmployeeName = b.EmployeeName

【问题讨论】:

你是如何加入表格的? 每位员工是否最多有 2 个 JobKey?那些仅限于 2 个 JobKeys“职责”和“角色”吗?或者还有更多?如果每个员工的 JobKey 数量未知,那么这可能需要 Dynamic Sql。 在您想要的输出中似乎有些不对劲。您让 John Doe 完成所有工作,而 Jane 甚至不在结果集中。 为什么将名称存储在两次不同的表中? @jarlh 好点。 Table2 应该只有 EmployeeID 作为外键。而不是复制 EmployeeName。可能与 JobKey 相同,这是一个名称。这与规范化的良好做法背道而驰。 【参考方案1】:

您可以使用条件聚合:

select t1.*, t2.jobkey_1, t2.jobvalue_1, t2.jobkey_2, t2.jobkey_2
from table1 t1 left join
     (select t2.employeename, 
             max(case when seqnum = 1 then jobkey end) as jobkey_1,
             max(case when seqnum = 1 then jobvalue end) as jobvalue_1,
             max(case when seqnum = 2 then jobkey end) as jobkey_2,
             max(case when seqnum = 2 then jobvalue end) as jobvalue_2,
      from (select t2.*, row_number() over (partition by employeename order by rowid) as seqnum
            from table2 t2
           ) t2
       group by employeename
      ) t2;

注意:您似乎使用员工姓名作为表之间的连接键。您确实应该使用员工 ID。

【讨论】:

以上是关于SQL Server - 连接表,使多行变成一行的主要内容,如果未能解决你的问题,请参考以下文章

SQL一行多列数据分解成多行数据

Sql Server合并多行询数据到一行:使用自连接FOR XML PATH('')STUFF或REPLACE函数

SQL将多行左连接成一行

关于SQL Server将一列的多行内容拼接成一行,合并显示在另外表中

如何用sql语句将多行合并成一行

SQL Server将一列的多行内容拼接成一行的实现方法