2010-10-05 24 views
2

如果我有一個表...我應該使用自加入

ID  Name Manager 
    0  Joe Sue 
    1  Jake Tom 
    0  Joe Tom 
    2  Larry Red 
    2  Larry Paul 
    1  Jake Paul 

我所要的輸出是....

ID Name Manager1 Manager2 
0 Joe Sue   Tom 
1 Jake Tom   Paul 
2 Larry Red   Paul 

謝謝...

+6

Blech。這就是我所要說的。 – 2010-10-05 13:01:29

+1

是的,你必須使用自聯接。 – 2010-10-05 13:02:57

+1

哎呀,這麼多的冗餘表,沒有一個適當的主鍵/索引... Niiii​​iice! – Shikiryu 2010-10-05 13:03:54

回答

3

呀,如果你的表被稱爲「經理」:

SELECT Mgr1.ID,Mgr1.Name,Mgr1.Manager,Mgr2.Manager 
FROM Managers AS Mgr1 
LEFT JOIN Managers AS Mgr2 
ON Mgr1.ID=Mgr2.ID 
4

如果我已經正確理解你的請求,是的,類似的東西會產生你正在尋找的結果。

SELECT 
t1.Name Name, 
t1.Manager Manager1, 
t2.Manager Manager2 
FROM 
Table t1 
inner join Table t2 on t1.Manager = t2.Name 

當然,返回索引列的外鍵將優先於強效性能比較。

+0

你測試了嗎?我相信這個查詢不會返回任何行。 – Vaibhav 2010-10-05 13:36:22

0

如果您保持連接將是最好的表。

如果你討厭加入,你可以結合最大和最小管理者,即使這樣,如果總是有兩個經理,他們不能有相同的名稱,它將工作。

如果我記得如何正確地加入2個查詢,下面的內容應該可以工作。但我會建議看看是否有可能重新修改你的表格,在經理人員關係中有一張單獨的表格將人員彼此連接起來。

SELECT DISTINCT 
    F.ID, F.Name, S.Manager, F.Manager 
FROM 
    (SELECT 
     ID, Name, MIN(manager) manager 
    FROM Managers 
    GROUP BY ID, Name) F, 
    (SELECT 
     ID, Name, MAX(manager) manager 
    FROM Managers 
    GROUP BY ID, Name) S 
WHERE 
    F.ID = S.ID 
    AND S.Manager <> F.Manager 
    AND F.ID < S.ID