我正试图从这里解决问题13:http://sqlzoo.net/wiki/The_JOIN_operation在其中我应该“列出每场比赛的每场比赛,如图所示”。我认为这就是答案:
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,则此查询不返回任何行。我尝试将SUM
包裹在ISNULL
和COALESCE
中,但它没有帮助。
说实话我真的不是在寻找如何解决问题的答案,而是解释为什么当得分为0:0时这个查询没有向我显示行的答案。此外,如果有人可以帮助我找到0 column_name
或1 column_name
背后的含义(因为它似乎是上面CASE
的结果),它似乎是0 * column_name或1 * column_name,但我不确定,当我试图寻找答案时谷歌充满了无关的结果。
答案 0 :(得分:2)
你没有得到0-0游戏的任何结果,因为join运算符只返回两个表中匹配的那些行。另一种说法是,您只会获得在ON
子句中指定的ID(在您的情况下为匹配ID)在两个表中都可用的行。
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
我还建议您为表使用别名并将它们作为列名称的前缀,以避免混淆哪个字段属于哪个表。