为什么我的SQL查询返回没有行,总和为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。我试图在ISNULL
和COALESCE
包裹SUM
,但它并不能帮助。
要告诉你真相,我并不是在寻找如何解决问题的答案,而是解释为什么当分数为0时,此查询未显示行的答案。此外,如果有人可以帮我找到0 column_name
或1 column_name
背后的含义(因为它似乎是CASE
以上的结果),它似乎是0 * column_name或1 * column_name,但我不确定,并且谷歌充满当我试图寻找答案时,无关的结果。
PS:是的,我看过具有相同或类似名称的前20分建议的堆栈溢出的问题,我很抱歉,如果这是一个重复的
答
你没有得到任何的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
我也建议你使用别名的表,并将其前缀列名,以避免哪些领域属于哪个表的混乱。