2017-05-05 102 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 

我也建议你使用别名的表,并将其前缀列名,以避免哪些领域属于哪个表的混乱。

相关问题