2016-08-04 81 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非常好的方式来解释它 - 发生在输出行上的条目之间没有关系。 –