SQL 左外连接多个表
SQL left outer join multiple tables
我有三个 table,我想我需要创建一个左外连接。
国家:
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
我想return统计自 2014 年以来按国家名称和合作伙伴名称注册的所有会员,包括所有没有国家名称的会员。 (所以这应该包括 country_id 为 200 的 Ken,这与 table 国家/地区的某个国家/地区不匹配。
到目前为止我有
SELECT
country.country_name, partner.partner_name
FROM
COUNT (*) from member
WHERE
registration_date >= 2014-01-01
但我意识到我可能离题太远了。
提前感谢您的帮助。
类似于:
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
当使用两个左外连接时,如果你想从 table 3 中获取匹配的行,而在 table 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
但请注意,您所有的空值都将被计算在一起..所以没有分配国家/地区的每个人都在同一个国家/地区。
除非我误解了这个问题,否则这是 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_id
和 country_id
的使用。
我有三个 table,我想我需要创建一个左外连接。
国家:
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
我想return统计自 2014 年以来按国家名称和合作伙伴名称注册的所有会员,包括所有没有国家名称的会员。 (所以这应该包括 country_id 为 200 的 Ken,这与 table 国家/地区的某个国家/地区不匹配。
到目前为止我有
SELECT
country.country_name, partner.partner_name
FROM
COUNT (*) from member
WHERE
registration_date >= 2014-01-01
但我意识到我可能离题太远了。
提前感谢您的帮助。
类似于:
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
当使用两个左外连接时,如果你想从 table 3 中获取匹配的行,而在 table 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
但请注意,您所有的空值都将被计算在一起..所以没有分配国家/地区的每个人都在同一个国家/地区。
除非我误解了这个问题,否则这是 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_id
和 country_id
的使用。