2017-06-01 86 views
0

我有兩個表PERSONPERSONRELATION內部連接後自我連接

PERSON表我有列PERSONpkFIRSTNAMELASTNAME

PERSONRELATION表我有MANAGER1fk這是一個fk爲PERSONpk

我想加入這兩個表,將上面的所有字段和自我加入回來添加MANAGERFIRSTNAMEMANAGERLASTNAME。這是我做了什麼,但它顯然是不正確的:

Select PERSONpk, MANAGER1FK,e.FIRSTNAME,e.LastName,m.FIRSTNAME,M.LASTNAME 
FROM dbo.PERSON e 
INNER JOIN dbo.PERSONRELATION rel 
ON rel.PERSONFK = PERSONPK 
INNER JOIN dbo.PERSON m ON e.PERSONpk = m.MANAGER1FK 
+0

你能顯示一些樣品數據和預期結果嗎? –

+1

在你的第一次連接看起來你正在引用同一列,如果我理解你的模式,你應該使用'rel.MANAGER1FK = e.PERSONPK'。 –

+1

最後的連接看起來不對。人與人之間的關係並不正確。 它應該是'on m.personpk = rel.manager1fk' rel包含員工和經理標識根據您在頂部的描述。 – xQbert

回答

1

三個問題:

  • 你的最後一個加入錯了(你到E的時候,我相信你wnat加入相對回加盟.Manager1FK到m。想想線性......我有一個員工......一個員工可以有很多關係......每個關係都是給另一個員工......並且根據列名稱,這些關係是員工經理關係。所以你從P - > REL - > M M - P不能在你的數據示例中不存在REL。
  • 你應該在第二次加入時別名e.personpk
  • 給你參考人兩次從一個人的所有列必須使用別名(甚至在select)

表personrelation包含FK爲員工和經理人都;因此你需要加入來自personrelation(MANAGER1fk)的第二個fk字段(並且這不是一個自加入)。如果層次結構全部維護,那麼它將是一個自加入。

SELECT e.PERSONpk 
    , rel.MANAGER1FK 
    , e.FIRSTNAME 
    , e.LastName 
    , m.FIRSTNAME 
    , M.LASTNAME 
FROM dbo.PERSON e 
INNER JOIN dbo.PERSONRELATION rel 
    ON rel.PERSONFK = e.PERSONPK 
INNER JOIN dbo.PERSON m 
    ON m.PERSONpk = rel.MANAGER1FK 
+0

使用INNER JOINs將消除沒有老闆的老闆。你應該能夠用INNER JOIN和LEFT OUTER JOIN來抓住老闆。 – Shawn