SQL 新手。构建我的第一个联系人管理器项目。当前架构如下所示。
问题:
- 我正在研究显示给定联系人的所有联系人类型(电话、电子邮件、社交、地址)的视图。
- 我将以下尝试放在一起,但它仅
contactGUID
在每个 contact_type 表中都返回结果。
--Problem: Only returns records if contactGUID is present in every contact_type table
SELECT
c.contGUID, c.contType,
i.indTitle, i.indFirstName, i.indMidName, i.indLastName,
e.emailAddress, e.emailDomain,
p.phnCountryCode, p.phnAreaCode, p.phnNumber,
s.socURL, s.socHandle,
a.addrCountry, a.addrCountryCode, a.addrCountrySubdivision, a.addrCountrySubName, a.addrSecondarySubdiv, a.addrMunicipality, a.addrMuniSubdivision, a.addrStreetNumber, a.addrStreetName, a.addrPostalCode, a.addrLatitude, a.addrLongitude
FROM
CONTACT c
JOIN INDIVIDUALS i
ON c.contGUID = i.indGUID
JOIN CONTACT_EMAIL ce
ON c.contGUID = ce.contactGUID
JOIN EMAILS e
ON ce.emailGUID = e.emailGUID
JOIN CONTACT_PHONE cp
ON c.contGUID = cp.contactGUID
JOIN PHONES p
ON cp.phnGUID = p.phnGUID
JOIN CONTACT_SOCIAL cs
ON c.contGUID = cs.contactGUID
JOIN SOCIALS s
ON cs.socGUID = s.socGUID
JOIN CONTACT_PHYS_ADDRESS cpa
ON c.contGUID = cpa.contactGUID
JOIN PHYS_ADDRESSES a
ON cpa.addrGUID = a.addrGUID
问题:
CONTACT_PHONE
如果给定的记录不存在,我如何返回所有其他联系类型(电子邮件、社交、地址)contactGUID
?
正如 Akina 所提到的,您需要使用一个
OUTER JOIN
,具体LEFT OUTER JOIN
或更简单地写成LEFT JOIN
从 join 子句的左侧获取所有记录,在它们与子句右侧匹配的地方加入,然后只NULL
取出字段它们在右侧不匹配的地方。W3Schools的本教程简要介绍了不同连接类型的视觉效果。这是另一篇文章,其中包含有关不同连接类型的更多信息。(请注意,这些文章与数据库无关,您的特定系统可能还有其他可用的连接类型,但这些通常都是需要的。)您之前所做的只是指定
JOIN
使用该INNER JOIN
子句的简写语法,它只返回在连接子句两侧匹配的行。