2013-02-25 32 views
2

所以伊夫使用此select聲明:SQL Select/Join Statement - 選擇何時不存在Join?

select runners.name, runners.age, sum(races.laptime) as totallaptime 
from runners join races on runners.runnerid = races.runnerid 
where runners.region = "region001" 
group by runners.runnerid 

列出全部來自特定區域的亞軍,並給出一個總的他們所有的單圈成績。

不幸的是,這使得該地區沒有圈速時間的所有跑步者都錯過了(大概是因爲他們在races數據庫中沒有條目)。

如何調整這個select說法得到它包括在特定區域內的所有選手,並列出totallaptime一個0,如果他們還沒有得到在races數據庫中的任何條目?

(對不起,我含糊不清的問題標題,我不可能想到的總結這個問題的任何方式)

TIA

回答

5

使用LEFT JOIN

select runners.name, runners.age, coalesce(sum(races.laptime),0) as totallaptime 
from runners 
left join races on runners.runnerid = races.runnerid 
where runners.region = "region001" 
group by runners.runnerid 

一個LEFT JOIN選擇所有行如果它們存在,則返回右表的結果;如果它們不存在,則返回其值爲NULL的單行。

注意:我在該聲明中添加了COALESCE,因爲總和NULL將導致NULL;這將改變這些值轉換爲0。

1

編輯必須使用LEFT JOIN甚至包括左表中的不匹配記錄

select runners.name, runners.age, sum(races.laptime) as totallaptime 
from runners left join races on runners.runnerid = races.runnerid 
where runners.region = "region001" 
group by runners.runnerid 
+1

一個'RIGHT'這個where子句將作爲一個'INNER JOIN'加入。 – cjk 2013-02-25 09:50:45

+1

是的,謝謝你指出我的錯誤 – Meherzad 2013-02-25 09:51:11

3

你將不得不使用LEFT OUTER JOIN,它也給你的結果從「左」表(在這種情況下runners),其中沒有匹配的「正確」的表:

select runners.name, runners.age, sum(races.laptime) as totallaptime 
from runners LEFT OUTER JOIN races on runners.runnerid = races.runnerid 
where runners.region = "region001" 
group by runners.runnerid