我有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
答案 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