簡體   English   中英

多次聯接同一張桌子

[英]Joining same table multiple times

我有2個表Person a Department-每個人都有多個針對他注冊的部門。

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

這樣的事情會讓您多次連接同一張表。 您只需為每個聯接賦予不同的別名

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 (或用於鏈接表命名約定的任何約定)。方式。

在這種情況下,您可以使用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個實體:-人員-部門-person_department_assignation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM