列出每场比赛,每场比赛得分如图所示。这将使用“CASE WHEN”,这在之前的任何练习中都没有解释过

时间:2017-07-06 05:23:02

标签: sql join left-join inner-join

问题陈述“将每场比赛列入每支球队得分的目标,如下所示。”

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表仅包含两个表共有的信息。

The Database tables

2 个答案:

答案 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 没有进球。