SQL:外部联接具有一对多关系

时间:2016-08-04 21:44:35

标签: mysql join

所以,我正在使用纯SQL开发我的外部联接技能(MySQL是我正在使用的DBMS)。我有四张桌子:人,地址,电话,电子邮件。一切都很自我解释。人是主表,其他三个中的每个记录都包含一个引用People表的外键。

我想编写一个将在所有四个表上执行外连接的查询。理想情况下,这就是我想要的结果:

Name         Address         Phone         Email
Bob          5 Steel Dr      512-222-1358  bob@gmail.com
Bob                          212-333-4444  bob@aol.com
Bob                                        bob@hotmail.com

这个想法是让地址/电话/电子邮件记录完全不重复。人员表中的信息可以重复,这很好,但我会尽量避免其他人的重复。

这是我非常非常粗略的版本。

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;
但是,它并没有起作用。它重复所有相互匹配的记录。

有没有办法达到我想要的效果?我在外连接上有点生锈。

2 个答案:

答案 0 :(得分:2)

并非没有跳过很​​多不可靠的"箍",通常涉及会话变量。

您忽略了您想要的结果集意味着不存在的关系。 5 Steel Dr512-222-1358bob@gmail.com没有直接联系。您的结果稍微暗示电话号码可能出现在该地址。您拥有的是3个恰好并排排列的列表。

输出此类结果的查询相当于为每一行提供一个"行号"。

答案 1 :(得分:1)

没有简单的解决方案来获取您在单个SQL查询中描述的输出。

这应该不足为奇,因为该输出违反了Fourth Normal Form

老实说,我会运行三个查询,一个用于People加入地址,一个用于People加入电话,一个用于People加入电子邮件。

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;

然后在应用程序代码中组合您想要的结果。