SQL左外连接多个表

时间:2015-01-14 16:26:40

标签: sql left-join

我有三张桌子,我想我需要创建一个左外连接。

国家:

country_id   country_name  
--------------------------
   15        United States  
   20        Sweden  

合作伙伴:

partner_id    partner_name  
---------------------------
   1          Atlas Group  
   2          Jenkins  
   3          Roadmap  

成员:

member_id    name    registration date    partner_id    country_id  
------------------------------------------------------------------
   001       Bob     2014-01-02                1            15  
   002       Ken     2014-05-02                3            20  

我想返回自2014年以来按国家名称和合作伙伴名称注册的所有成员的计数,包括所有没有国家/地区名称的成员。 (所以这应该包括Ken,country_id为200,与国家/地区表中的国家/地区不匹配。

到目前为止我已经

SELECT 
    country.country_name, partner.partner_name 
FROM 
    COUNT (*) from member 
WHERE
    registration_date >= 2014-01-01

但我意识到我可能会离开。

提前感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

类似的东西:

select 
    a.*
    ,p.partner_name
from
    (
        select 
            m.name
            ,c.country_name
            ,partner_id
        from 
            member as m 
            left outer join country as c
                on m.country_id = c.country_id
        where 
            registrationdate >= '2014-01-01'
    ) as a
    left outer join partner as p
        on p.partner_id = a.parner_id

当使用两个左外连接时,如果要从表3中获取表2中没有匹配行的匹配行,则需要将第一个包装在子查询中。如果我记得正确的话。

编辑:抱歉没有看到计算问题的一部分!

select 
    a.country
    ,p.partner_name
    ,count(*)
from
    (
        select 
            m.name
            ,c.country_name
            ,partner_id
        from 
            member as m 
            left outer join country as c
                on m.country_id = c.country_id
        where 
            registrationdate >= '2014-01-01'
    ) as a
    left outer join partner as p
        on p.partner_id = a.parner_id
group by 
    a.country
    ,p.partner_name

但请注意,因为所有空值都将计算在一起..所以没有分配国家/地区的所有人都在同一个国家/地区。

答案 1 :(得分:0)

除非我误解了这个问题,否则这只是2张桌子的左边连接。

SELECT country_name, partner_name, count(member_id)
FROM member
    LEFT JOIN partner USING (partner_id)
    LEFT JOIN country USING (country_id)
WHERE registration_date >= '2014-01-01'
GROUP BY partner_id, country_id

如果您想要求合作伙伴存在,那么您可能希望将LEFT JOIN partner ...更改为JOIN partner ...

您可以使用ON的{​​{1}}语法,但是您必须在查询的其他位置限定使用JOINspartner_id