当通过链接表

时间:2017-06-08 17:42:43

标签: sql oracle11g toad

我在尝试弄清楚如何编写一个SQL语句时会遇到一些麻烦,该语句将返回左表中找到的相同数量的记录。从右表中获取数据的唯一方法是使用第3个表。

例如,我有三个表,网站,地址和附属机构。许多从属关系可以对站点(联系人,邮寄地址,所有者和官方)有效,但可能没有与该联盟关联的人员或地址。 IE浏览器。网站可能有联系人,但没有指定官方,或者网站可能尚未分配邮寄地址。 站点(左表)和附属关系通过公共ID链接。 Sites.ID = Affiliations.Site_ID

关联和地址(右表)通过公共地址记录ID链接 Affiliations.Address_RID = Addresses.RID

我的查询是

SELECT A.ID,
    A.NAME,
    C.ADDR_1,
    C.CITY_NAME,
    C.STATE_CODE,
    C.POSTAL_CODE
FROM SITES A,
    AFFILIATIONS B,
    ADDRESSES C
WHERE A.ID = B.SITE_ID
    AND B.ADDRESS_RID = C.RID
    AND B.AFFILIATION_TYPE = 'MAILING ADDRESS'
ORDER BY A.ID

如果我单独查询sites表,我得到的结果是1580个站点记录。运行上面的邮件地址查询我得到1386条记录。对于没有邮件地址的记录,我需要返回所有带有空值的1580条记录。 我做错了什么,但我没有看到它。

评论

由于

2 个答案:

答案 0 :(得分:0)

你应该尝试左连接,如果它不起作用,那么删除where条件。

SELECT A.ID,
    A.NAME,
    C.ADDR_1,
    C.CITY_NAME,
    C.STATE_CODE,
    C.POSTAL_CODE
FROM SITES A,
left join AFFILIATIONS B  on A.ID = B.SITE_ID
left join ADDRESSES C on B.ADDRESS_RID = C.RID
    WHERE 
     B.AFFILIATION_TYPE = 'MAILING ADDRESS'
ORDER BY A.ID

答案 1 :(得分:0)

" old"外连接的Oracle语法如下: -

SELECT A.ID,
    A.NAME,
    C.ADDR_1,
    C.CITY_NAME,
    C.STATE_CODE,
    C.POSTAL_CODE
FROM SITES A,
    AFFILIATIONS B,
    ADDRESSES C
WHERE A.ID = B.SITE_ID (+)
    AND B.ADDRESS_RID = C.RID (+)
    AND B.AFFILIATION_TYPE (+) = 'MAILING ADDRESS'
ORDER BY A.ID

但你真的应该使用ANSI语法 - 更容易看到什么是连接条件和什么是过滤器: -

SELECT A.ID,
    A.NAME,
    C.ADDR_1,
    C.CITY_NAME,
    C.STATE_CODE,
    C.POSTAL_CODE
FROM SITES A
LEFT JOIN AFFILIATIONS B ON A.ID = B.SITE_ID AND B.AFFILIATION_TYPE = 'MAILING ADDRESS'
LEFT JOIN ADDRESSES C ON B.ADDRESS_RID = C.RID
ORDER BY A.ID

请注意,Affiliation类型的条件需要包含在join子句中。如果您将其包含在where子句中,那么您将无法返回任何没有“邮件地址”的行。从属关系类型。