【问题标题】:SQL left outer join multiple tablesSQL左外连接多个表
【发布时间】:2015-01-14 16:26:39
【问题描述】:

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

国家:

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 年以来按国家名称和合作伙伴名称注册的所有成员的计数,包括所有没有国家名称的成员。 (所以这应该包括 country_id 为 200 的 Ken,它与国家表中的国家不匹配。

到目前为止我有

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

但我意识到我可能还差得很远。

提前感谢您的帮助。

【问题讨论】:

  • MemberPartner 有何关系?它们是否使用partner_idmember_id 关联?
  • 抱歉,有一个 partner_id。我已经添加了这个。
  • 如果没有member.partner_id 或者member.partner_idpartner 中不存在,您希望发生什么?

标签: sql left-join


【解决方案1】:

类似:

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

但请注意,您的所有空值都将被计算在内。所以没有指定国家/地区的每个人都在同一个国家/地区。

【讨论】:

  • 我将registrationdate > '2014-01-01' 更改为registrationdate >= '2014-01-01' 以防有人在该日期注册。
  • 大声笑,谢谢!这么容易犯的错误,但你可能会走很长时间而没有注意到它的存在!
  • 我不明白为什么需要子查询。为什么不是简单的LEFT JOIN
  • 我已经习惯了某些行为,我希望我是正确的,但是:如果你离开外连接 a->b,然后离开外连接到表 c,你永远不会从表中得到行c 表 b 中没有。如果我错了,请告诉我,这只是我不再做的事情。
【解决方案2】:

除非我误解了这个问题,否则这是 2 个表的简单 LEFT JOIN。

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 ...

您可以对JOINs 使用ON 语法,但是您必须在查询的其他地方限定partner_idcountry_id 的使用。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2021-06-19
    • 2010-09-21
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多