2017-06-08 53 views
0

我在尝试找出如何编写将返回左表中找到的相同数量记录的SQL语句时遇到了一些问题。从右表获取数据的唯一方法是使用第三个表。当通过链接表连接右表时,返回所有左表记录

例如,我有三个表格,站点,地址和联盟。一个网站(联系人,邮寄地址,所有者和官员)可以有多个联盟,但可能没有与联盟关联的个人或地址。 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 

如果我单独查询网站表,我得到的结果是1580个网站记录。运行上述查询邮件地址我得到1386条记录。我需要返回所有1580个记录,其中包含邮寄地址不存在的记录。 我做错了什么,但我没有看到它。

评论?

谢谢

+0

将您的逻辑分解成2或3个单独的查询,使用临时表来加入它们,以及在SQL中可以清楚地看到自己的逻辑时,可以组合所有子查询。顺便说一下,您目前已加入表格,但您不清楚您加入的是什么。使用join关键字并且不加入where子句 –

+0

我想知道是否使用子查询是要去的路线。实际上有3个我用于过滤器的表格比我在示例中使用的要多。对于符合2个连接表(1580条记录)条件的网站,查询为1。 1根据网站的联系信息产生1521个联系人。而1个邮寄地址返回1386条记录。 –

回答

0

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

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 
+0

您的左加入到联盟B是毫无意义的,因为您在where子句中对B应用谓词。 –

0

对于外的“老”甲骨文语法加入是这样的: -

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 

请注意,关联关系类型的条件需要在联接子句中进行。如果将它包含在where子句中,则不会返回任何没有“MAILING ADDRESS”联系类型的行。

+0

谢谢!我仍然使用“旧”的Oracle语法,因为这是我学到的东西,而且我们还没有升级(当然,缺乏资金),所以我没有使用ANSI语法。看到我加入的内容要容易得多。 –

相关问题