2017-05-05 81 views
0

我試圖從這裏解決問題13:http://sqlzoo.net/wiki/The_JOIN_operation其中我應該「列出每個匹配與每個團隊得分的目標 」。我認爲這將是答案:爲什麼我的SQL查詢返回沒有行,總和爲0

SELECT 
    mdate, team1, 
    SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) score1, 
    team2, 
    SUM(CASE WHEN teamid=team2 THEN 1 ELSE 0 END) score2 
FROM 
    game 
JOIN 
    goal ON matchid = id 
GROUP BY 
    team1, team2, mdate 
ORDER BY 
    mdate 

然而,這查詢不返回行,如果兩隊得分爲0。我試圖在ISNULLCOALESCE包裹SUM,但它並不能幫助。

要告訴你真相,我並不是在尋找如何解決問題的答案,而是解釋爲什麼當分數爲0時,此查詢未顯示行的答案。此外,如果有人可以幫我找到0 column_name1 column_name背後的含義(因爲它似乎是CASE以上的結果),它似乎是0 * column_name或1 * column_name,但我不確定,並且谷歌充滿當我試圖尋找答案時,無關的結果。

PS:是的,我看過具有相同或類似名稱的前20分建議的堆棧溢出的問題,我很抱歉,如果這是一個重複的

回答

2

你沒有得到任何的0-0場比賽,因爲結果連接運算符僅返回那些在兩個表中匹配的行。另一種說法是,只有在你的ON子句中指定的ID(您的案例中的匹配ID)在兩個表中都可用的行中。

0-0遊戲在goal表中沒有任何記錄,這就是爲什麼您使用的inner join沒有返回任何記錄。

您需要使用left join,這樣左表中的所有行(game)都會保留,即使它們在右表中沒有匹配的行(goal)。

SELECT t1.mdate, 
     t1.team1, 
     SUM(CASE WHEN t2.teamid = t1.team1 THEN 1 ELSE 0 END) score1, 
     t1.team2, 
     SUM(CASE WHEN t2.teamid = t1.team2 THEN 1 ELSE 0 END) score2 
FROM game t1 
LEFT JOIN 
     goal t2 
ON  t2.matchid = t1.id 
GROUP BY t1.team1, t1.team2, t1.mdate 

我也建議你使用別名的表,並將其前綴列名,以避免哪些領域屬於哪個表的混亂。

相關問題