列出每场比赛以及每支球队的进球数,如图所示。这将使用“CASE WHEN”,这在之前的练习中都没有解释过

问题描述 投票:0回答:3

问题指出“列出每场比赛以及每支球队的进球数,如下所示。”

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

sql join left-join inner-join
3个回答
0
投票

他们怎么知道要使用哪种 JOIN

LEFT JOIN ON
的定义是,它返回
(INNER) JOIN ON
的行加上左表由
NULL
s扩展的不匹配行。

(当左行不用于形成结果行时,

INNER JOIN ON
中的左行是“不匹配的”。)

因此,对于每个左行输入,始终至少有一行输出。当关联的

INNER JOIN
对于某些左行输入输出多于一行时,将会有不止一行。如果 LEFT JOIN 处于 ON 状态,要求左 FK(外键)子行等于其引用的右表子行,则每一行输入将恰好有一行输出。

对于 LEFT JOIN,它从游戏表中获取所有信息并合并到目标,其中仅包括与目标表匹配的信息。 JOIN 表将仅包含两个表共有的信息。

您使用的术语太模糊了。它们实际上并没有描述操作员计算的内容。 (在这种情况下或一般情况下。)“从中获取信息”、“合并到”、“仅包含匹配的信息”和“包含两个表共有的信息”可能会唤起操作员会做什么,如果您已经知道,但他们没有清楚地描述定义。在技术工作中,记住技术术语的准确定义并能够以正确的方式使用这些术语非常重要。

是否有任何经验法则可以根据人类可读的描述构建 SQL 查询?


0
投票

这里我们使用左连接而不是内连接,因为 ques 要求列出所有比赛,并且不需要在每场比赛中都进球,我们可以在进球列中缺少 matchid 值,您可以通过执行以下查询来检查:

select * from game left join goal on id=matchid

其中 matchid 为 NULL

您会发现 matchid 1028 和 1029 没有进球。


0
投票

'''选择日期, 团队1, 总和(案例 当 teamid=team1 THEN 1 ELSE 0 END) 分数 1, 团队2, 总和(案例 当 teamid=team2 THEN 1 ELSE 0 END) 得分 2 FROM 游戏 LEFT JOIN 目标 ON matchid = id GROUP BY mdate, team1,team2 ORDER BY mdate, matchid'''

© www.soinside.com 2019 - 2024. All rights reserved.