2015-01-14 326 views
0

我有三個表,我想我需要創建一個左外連接。SQL左外連接多個表

國家:

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年起註冊的所有成員的計數名稱包括所有沒有國名的成員。 (因此,這應包括肯與200 COUNTRY_ID這不符合一個國家在該國表。

到目前爲止,我

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

,但我知道我大概的路要走。

預先感謝您的任何援助

+0

'會員'與'Partner'有什麼關係?他們是否使用'partner_id'和'member_id'關聯? – Taryn

+0

道歉,有一個partner_id。我已經添加了這個。 – CompilerSaysNo

+0

如果沒有'member.partner_id'或者'partner.partner_id'不存在於'partner'中,你想要發生什麼? –

回答

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 

但要小心,因爲所有的空值將被算在一起..所以大家沒有分配的國家是在同一個國家。

+2

爲了防止有人在當天註冊,我會將registrationdate>'2014-01-01'更改爲registrationdate> ='2014-01-01'。 – sksallaj

+0

哈哈,謝謝!這樣一個容易犯的錯誤,但你可以去很長一段時間沒有注意到它! – gordatron

+0

我不明白爲什麼子查詢是必要的。爲什麼它不是一個簡單的'LEFT JOIN'? –

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語法爲JOINs但你必須有資格使用partner_idcountry_id在查詢的其他地方。