【发布时间】:2018-12-10 19:10:11
【问题描述】:
我正在尝试编写一个 SELECT 语句,该语句将显示原始得分超过 190 分的投球手,在他们输掉的比赛中。
这段代码检索到 960 个结果,每个人的分数要么是 192 要么是 193,每个人都显示在每个团队中,并且每个团队在同一场比赛中多次参加比赛。
SELECT bs.MATCHID "Match", t.TEAMNAME "Team Name",
b.BOWLERFIRSTNAME || ' ' || b.BOWLERLASTNAME "Bowler Name",
bs.GAMENUMBER "Game Number", bs.RAWSCORE "Raw Score"
FROM BOWLER_SCORES bs, TEAMS t, BOWLERS b, MATCH_GAMES m
WHERE bs.MATCHID = m.MATCHID
AND bs.GAMENUMBER = m.GAMENUMBER
AND bs.WONGAME = 'N'
AND bs.RAWSCORE >= 190;
您可以看到这显然是错误的,而从根本上来说,我在代码中做错了。我只是不确定它是什么,以及我应该做些什么不同的事情。
我对 SQL 很陌生,因此非常感谢您提供的任何其他建议或指示。
【问题讨论】:
-
从不在
FROM子句中使用逗号。 始终使用正确、明确、标准JOIN语法。 -
您似乎错过了某些表格的关联方式。例如,您展示了 bowler_scores 与 match_games 的关系,而不是球队或投球手与这些表中的任何一个的关系。因此,您有一个交叉连接的数据,其中所有投球手和球队将乘以 match_games 和投球手得分中的记录#of Teams * number of Bowlers * # of records where bowler_Scores.matchID = match_Games.MatchID。和 BS.GameNumber = M.gameNumber。因此,如果您有 10 个投球手、5 场比赛和 150 个投球手得分,那么您最终会得到 7500 个记录,而您可能只想要 150 个。
-
@Parfait:Oracle 开发人员过去争论的所有理由都不再有效
-
@Parfait -- 你真的认为 18 年前产品中的错误会影响人们现在应该做什么吗?
-
A minimal reproducible example 包括 DBMS(带版本)、清晰的规范、剪切和粘贴和可运行代码(具有小的代表性输入)(将表初始化格式化为表)和可区分(因此排序)所需的输出.但是调试的绝对基础说:表明你的程序在通过(子)表达式时做了你期望的事情,说明它是什么,并表明它实际上是通过增量输出做到的。在添加您无法修复的问题代码时,请研究(手册和网络)。重复,尽量减少工作代码和错误代码。然后询问工作示例和非工作示例之间的(小)差异。