SQL新手面临空行挑战

SQL新手面临空行挑战,sql,Sql,我可能也有一些设计上的问题,但如果有可能用我现在的设计做我愿意做的事情,我宁愿这样做,然后继续学习和优化 我有一个gamesresults表,每个游戏有两行(一行用于主场,一行用于客场)。 也就是说,有一行gameid 1和teamid 1(目标、积分等),然后另一行gameid 1有一个teamid 2的条目(目标、积分等)。 Gamesresults还有league id(了解游戏属于哪个联盟)和categoryid(一个联盟可以有几个类别) 我的游戏结果PK是gameid+teamid 我

我可能也有一些设计上的问题,但如果有可能用我现在的设计做我愿意做的事情,我宁愿这样做,然后继续学习和优化

我有一个gamesresults表,每个游戏有两行(一行用于主场,一行用于客场)。 也就是说,有一行gameid 1和teamid 1(目标、积分等),然后另一行gameid 1有一个teamid 2的条目(目标、积分等)。 Gamesresults还有league id(了解游戏属于哪个联盟)和categoryid(一个联盟可以有几个类别)

我的游戏结果PK是gameid+teamid

我认为,由于我将更多地关注排名,而不是输入游戏数据,因此我可以复制一些字段,以便有一个更简单的查询来构建排名

我还有一个团队表,其中有团队ID、名称等的团队,它还包括一个categoryid来描述团队所属的类别

我的目标是能够检索每支球队的进球、得分、比赛等汇总数据,并包括球队名称

此外,如果联盟中的一支球队还没有在锦标赛中打过任何比赛,我希望能够将其全部值列为0

我尝试过不同的查询和左/右连接组合等

我想到的最好的办法是:

SELECT 
teams.TeamID,
teams.TeamName,
SUM(PointsAwarded) as PTS,
SUM(TotalGF) as GF,
SUM(TotalGA) as GA,
COUNT(IDGame) as GP,
SUM(CASE WHEN PointsAwarded=2 THEN 1 ELSE 0 END) as W, 
SUM(CASE WHEN PointsAwarded=1 THEN 1 ELSE 0 END) as O, 
SUM(CASE WHEN PointsAwarded=0 THEN 1 ELSE 0 END) as L
from Teams
left join gamesresults on teams.TeamID = gamesresults.idteam
where Teams.TeamcategoryID=1 and gameresults.idleague=1
group by  teams.TeamID, teams.TeamName
order by pts desc
这给了我所有的球队,除了那些没有打过比赛的球队

如果我这样做(我从where条款中删除联盟ID):

当然给了我所有的球队(包括那些还没有打过一场比赛的球队),但它统计了每个联赛的比赛

有没有办法解决这个问题

谢谢


Sebastian

如果我理解正确,您需要将条件移动到ON子句以保留外部联接:

left join gamesresults 
on teams.TeamID = gamesresults.idteam 
and gameresults.idleague=1;

你,我的朋友,刚刚解决了一个问题,我已经处理了几个小时才放弃并寻求帮助。非常感谢你的帮助。。。现在我需要阅读+学习更多内容!:)很乐意帮忙。您是否理解它为什么有效?同样重要的是,为什么您最初的尝试没有成功?谢谢您的跟进。我想是的。是因为通过使用join的子句,我过滤了join的“before”,因此,join为在games表中没有相应匹配的团队带来了数据吗?如果我错了,请纠正我!:)也许更简单的理解方法是看看为什么它不起作用。外部联接“制造”的gameResult行将为空。NULL=1(您的联盟ID)永远不会是这种情况,因此它将始终无法通过测试,SQL将删除该行。这就是为什么你需要将其加入到加入中,以明确你的意图。
left join gamesresults 
on teams.TeamID = gamesresults.idteam 
and gameresults.idleague=1;