所以,我正在使用纯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;
但是,它并没有起作用。它重复所有相互匹配的记录。
有没有办法达到我想要的效果?我在外连接上有点生锈。
答案 0 :(得分:2)
并非没有跳过很多不可靠的"箍",通常涉及会话变量。
您忽略了您想要的结果集意味着不存在的关系。 5 Steel Dr
,512-222-1358
和bob@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;
然后在应用程序代码中组合您想要的结果。