SQL 尝试外部连接表但不工作

Posted

技术标签:

【中文标题】SQL 尝试外部连接表但不工作【英文标题】:SQL Trying to Outer Join Tables but not working 【发布时间】:2014-09-05 03:00:56 【问题描述】:

所以,我有一个大学作业,讲师选择这周生病,无法回答问题。

我们得到了一个由 4 个表格组成的棒球数据库供我们使用。表结构如下:

TABLENAME:(column1, column2...etc) PK = 主键,FK = 外键

PLAYER:(人数PK,姓名,dob,队伍FK,位置)

GAME:(num PK, gamedate, hometeam FK, awayteam FK, homecore, 客场得分)

GAMESTAT:(gamenum PK, playernum FK, homeruns, 三振出局)

TEAM:(代码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 表加入主队这一事实有关,它只能基于此选择主体育场。

您能提供的任何帮助将不胜感激。

【问题讨论】:

将您的 WHERE 子句移至 ON 子句以连接到 gamestat 【参考方案1】:

将您的 WHERE 子句移动到 ON 子句以连接到 gamestat

通过在 WHERE 子句中施加过滤条件,它发生在 执行连接之后,删除没有活动的体育场。一旦这个谓词被移动到适当的 ON 子句,它将在连接之前而不是之后过滤 gamestat。

您有幸在您学习的早期就遇到了 SQL 的这一重要怪癖,即谓词的位置会影响结果集。

【讨论】:

谢谢彼得,你是救生员。这让我发疯了一个星期。我从一位同学那里得到了一些建议,与你所说的效果差不多,但他告诉我把它放在错误的地方,这会导致错误。

以上是关于SQL 尝试外部连接表但不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql中选择2个表但不重复?

Pandas to_sql 创建表但不插入数据

SQL查询存在A表但不存在B表的数据

SQL查询存在A表但不存在B表的数据

完全外连接不显示不匹配的行 - SQL

rdd.saveAsCassandraTable() 创建表但不将 rdd 项写入 Cassandra