Join

即使在所有表中都沒有滿足條件,也從 SQL JOIN 返回結果

  • April 26, 2021

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子句的簡寫語法,它只返回在連接子句兩側匹配的行。

引用自:https://dba.stackexchange.com/questions/290451