所以,我是一个Uni任务,讲师本周选择生病,无法回答问题。
我们已经获得了一个由4个桌子组成的棒球数据库。表结构如下:
TABLENAME :( column1,column2 ......等)PK =主键,FK =外键
球员:(数字PK,名字,dob,球队FK,位置)
游戏:(num PK,gamedate,hometeam FK,offteam FK,本垒打, 客场比分)
GAMESTAT :( gamenum PK,playernum FK,homeruns,strikeout)
团队:(代码PK,名称,城镇,地面)
这个特别问题的目的是获得体育场的名称(球队桌上的地面),在那个地面上得分的本垒打的总和,三振出局的总和,然后是这些的总和指定日期范围内的两个值。
我的查询和问题如下:
SELECT
t.ground AS GROUNDPLAYED,
SUM(gs.homeruns) as TOTALHOMERUNS,
SUM(gs.strikeouts) AS TOTALSTRIKEOUTS,
SUM(gs.homeruns + gs.strikeouts) AS COMBINEDTOTAL
FROM team t
LEFT OUTER JOIN game g ON g.hometeam = t.code
LEFT OUTER JOIN gamestat gs ON g.num = gs.gamenum
WHERE g.gamedate BETWEEN '7-AUG-2014' AND '13-AUG-2014'
GROUP BY t.ground;
我的问题在于我为所玩的游戏获得了正确的值,但无论使用LEFT OUTER JOIN,我都没有得到所有体育场的列表。我确信这与我必须从GAME牌桌加入家庭队这一事实有关,而且它只能选择基于此的主场馆。
非常感谢您提供的任何帮助。
答案 0 :(得分:0)
将WHERE子句移动到ON子句,以便加入 gamestat 。
通过在WHERE子句中强加过滤条件,在连接完成后发生,删除没有活动的体育场。一旦将该谓词移动到相应的ON子句,它将在连接之前而不是之后过滤gamestat。
您遇到了这个重要的SQL怪癖,在您的教育早期,谓词的定位会影响结果集。