2016-08-04 80 views
0

因此,我正在使用純SQL(MySQL是我正在使用的DBMS)的外部連接技能。我有四張桌子:人,地址,電話,電子郵件。所有這些都很自我解釋。 People是主表,其他三個表中的每個記錄都包含一個外鍵引用People表。SQL:外部加入一對多關係

我想寫一個查詢,將在所有四個表上執行外連接。理想的情況下,這裏是我想要的結果看起來像:

Name   Address   Phone   Email 
Bob   5 Steel Dr  512-222-1358 [email protected] 
Bob       212-333-4444 [email protected] 
Bob          [email protected] 

的想法是有地址/電話/電子郵件記錄並不重複。 People表格中的信息可以重複,沒關係,但我會盡量避免重複其他信息。

這是一個非常非常粗糙的版本,我要去做什麼。

select p.name, e.email, a.address 
from people p 
left join email e on p.pid = e.pid 
left join address a on p.pid = a.pid 
where p.pid = 1; 

雖然它不起作用。它重複所有匹配的記錄。

有什麼辦法可以得到我要去的效果嗎?外部連接我有點生疏。

+0

查詢似乎是正確的..檢查數據.. – scaisEdge

回答

1

沒有簡單的解決方案來獲得您在單個SQL查詢中描述的輸出。

這應該不令人意外,因爲該輸出違反了Fourth Normal Form

老實說,我會運行三個查詢,一個用於加入地址的人員,一個用於加入電話的用戶,另一個用於加入電子郵件的人員。

select p.name, a.address 
from people p 
inner join address a on p.pid = a.pid 
where p.pid = 1; 

select p.name, ph.phone 
from people p 
inner join phone ph on p.pid = ph.pid 
where p.pid = 1; 

select p.name, e.email 
from people p 
inner join email e on p.pid = e.pid 
where p.pid = 1; 

然後在應用程序代碼中結合您想要的結果。

+0

確切如此:*「我的名字是鮑勃,我住在一個地址,我有四個電子郵件帳戶,你知道的。哦,是的,我有一個'個人手機',一個'工作手機'和一個足夠大的房子,仍然有一條銅線連接到它。「*您的模式需要能夠處理這個,使用單獨的表,*例如*:「人物」,「人物電話」,「人物電子郵件」。這裏至少有三個*一對多的關係,沒有任何關係。 –

2

不是沒有跳過很​​多不可靠的「箍」,通常涉及會話變量。

你忽略了你想要的結果集意味着那些不在那裏的關係。 5 Steel Dr,512-222-1358[email protected]沒有直接的聯繫。您的結果略微暗示該電話號碼可能出現在該地址。你所擁有的3個列表恰好並排排列。

輸出這種結果的查詢相當於給每行一個「行號」。

+0

+1非常好的方式來解釋它 - 發生在輸出行上的條目之間沒有關係。 –