多次加入同一个表

时间:2014-04-01 08:34:42

标签: sql sql-server

我有2个表人员部门 - 每个人都有多个部门注册了他。

Person

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

Dept
id |Name
100|Accounts
...
102|HR
...
106|Admin

最优雅的sql如何显示Jane的记录如下:

    Jane|Accounts|HR|Admin

4 个答案:

答案 0 :(得分:1)

使用它。并处理您的命名约定,使所有列名称都独立于表。

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

答案 1 :(得分:1)

这样的事情会让你多次加入同一张桌子。您只需为每个联接提供不同的别名

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(或者您用于链接表命名约定的任何约定),假设您可以控制架构,并且可以通过这种方式添加关系。

答案 2 :(得分:0)

在这种情况下,您可以使用STUFF

   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

答案 3 :(得分:0)

我知道的唯一方法是每列的连接。 但是如果你妨碍设计表格,我建议你规范化数据库。 如果某人需要额外的dept列,则需要更改该表以添加person的新属性。

对我来说,需要3个实体: - 人 - 部门 - person_department_assignation