问题陈述“将每场比赛列入每支球队得分的目标,如下所示。”
This is the result that the question is asking me to show.
我对LEFT JOIN
非常困惑,尤其是这个问题。最初,我使用了这段代码:
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 mdate, team1, team2
但是,由于SQLZOO结果不正确,因此无法给出正确的答案。所以,我在互联网上查找了答案,并说明了这一点:
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
**LEFT JOIN** goal ON matchid = id GROUP BY mdate, team1, team2
他们是如何知道使用哪种JOIN
的?我知道对于LEFT JOIN
,它从游戏表中获取所有信息并合并到目标,其中仅包含目标表的匹配信息。 JOIN
表仅包含两个表共有的信息。
答案 0 :(得分:0)
他们怎么知道使用哪种JOIN
LEFT JOIN ON
的定义是它返回(INNER) JOIN ON
行以及由NULL
扩展的左表的不匹配行。
(如果左侧是"不匹配"在INNER JOIN ON
中,当它不用于形成结果行时。)
因此,每个左行输入始终至少有一行输出。当关联的INNER JOIN
为某些左行输入输出多行时,将有多个。如果LEFT JOIN为ON,要求左FK(外键)子行等于其引用的右表子行,则每行输入将只有一行输出。
对于LEFT JOIN,它从游戏表中获取每个信息并合并到目标,该目标仅包括与目标表的匹配信息。 JOIN表仅包含两个表共有的信息。
您使用的条款太模糊了。他们实际上并没有描述运营商的计算方法。 (在这种情况下或一般情况下。)"从"中获取信息,"合并到","仅包括匹配信息到"和"包括两个表共有的信息"如果已经知道,可能会唤起运营商所做的事情,但他们不会明确地描述或定义 。对memorize the exact definitions of technical terms的技术工作很重要,只能以正确的方式使用这些术语。
Is there any rule of thumb to construct SQL query from a human-readable description?
答案 1 :(得分:-1)
这里我们使用的是左连接而不是内连接,因为 ques 要求列出所有比赛的简单事实,并且没有必要在每场比赛中都有进球,我们可以在目标中缺少 matchid 值列,您可以通过执行以下查询来检查:
select * from game left join goal on id=matchid
其中 matchid 为 NULL
并且您会发现 matchid 1028 和 1029 没有进球。