Sql 多次合并同一个表

Sql 多次合并同一个表,sql,sql-server,Sql,Sql Server,我在一个部门有两张表,每个人都有多个部门对他进行登记 Person id|name|dept1|dept2|dept3 1 |Jane|100 |102 |106 Dept id |Name 100|Accounts ... 102|HR ... 106|Admin 显示Jane记录最优雅的sql是什么,如下所示: Jane|Accounts|HR|Admin 用这个。并遵循命名约定,使所有列名独立于表而唯一 SELECT Person.id, Person.name, de

我在一个部门有两张表,每个人都有多个部门对他进行登记

Person

id|name|dept1|dept2|dept3
1 |Jane|100  |102  |106

Dept
id |Name
100|Accounts
...
102|HR
...
106|Admin
显示Jane记录最优雅的sql是什么,如下所示:

    Jane|Accounts|HR|Admin

用这个。并遵循命名约定,使所有列名独立于表而唯一

SELECT
Person.id, Person.name, dept1.Name, dept2.Name, dept3.Name
LEFT JOIN Dept dept1 ON dept1.id = Person.dept1
LEFT JOIN Dept dept2 ON dept2.id = Person.dept2
LEFT JOIN Dept dept3 ON dept3.id = Person.dept3

类似这样的操作将允许您多次加入同一个表。您只需为每个join指定一个不同的别名

SELECT * 
FROM Person AS P 
     INNER JOIN Dept AS D1 ON P.dept1 = D1.id 
     INNER JOIN Dept AS D2 ON P.dept2 = D2.id
WHERE P.name = 'Jane'
理想情况下,您可以规范化Person表中的数据,并在Person和Dept之间建立一个链接表,例如,
PersonDepartmentLinking
(或任何链接表命名约定的约定),前提是您可以控制模式,并且可以通过这种方式添加关系

在这种情况下可以使用

   Select name,
   Stuff((Select distinct ', ' + cast(Name as varchar(20))
           From #Dept t2
           Where t2.Id = t1.Id
           FOR XML PATH('')),1,1,'') 
    From Person t1

我知道的唯一方法是为每列创建一个联接。 但是如果您正在设计表,我建议您规范化DB。 如果某人需要一个额外的dept列,则需要修改该表以添加person的新属性

对于我来说,需要3个实体: -人 -系
-人员/部门/分配

为什么不试一试?这个问题似乎离题了,因为OP似乎没有尽力找到解决方案。@帕特里克霍夫曼快速搜索一下会给他一些解决方案。无论如何,使用Pivot和UnPivot可能会对他有所帮助