我有三张桌子,我想我需要创建一个左外连接。
国家:
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
但我意识到我可能会离开。
提前感谢你的帮助。
答案 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}}语法,但是您必须在查询的其他位置限定使用JOINs
和partner_id
。