【发布时间】:2018-06-01 05:21:24
【问题描述】:
您好,我正在尝试解决这个特定问题:
对于具有不可挽回的战斗损失且数据库中至少有三艘船的班级,显示班级的名称和沉没的船只数量。
基于此数据库: 参与二战的海军舰艇数据库正在考虑中。数据库由以下关系组成: 类(类,类型,国家,numGuns,孔,位移) 船舶(名称、等级、发射) 战斗(名称,日期) 结果(船,战斗,结果) 各类船舶都具有相同的总体设计。一个类通常被分配一个根据相应设计建造的第一艘船的名称,或者一个不同于数据库中任何船名的名称。其名称被分配到一个级别的船称为领导船。 Classes 关系包括类的名称、类型(可以是 bb 表示战舰,或 bc 表示战列巡洋舰)、舰艇建造的国家、主炮数量、火炮口径(口径以英寸为单位) , 和排量(重量,以吨为单位)。 Ships 关系包含有关船舶名称、相应类别的名称以及船舶下水年份的信息。 Battles 关系包含船只参与的战斗的名称和日期,而 Outcomes 关系 - 给定船只的战斗结果(可能是沉没、损坏或 OK,最后一个值表示船只在战斗中幸存下来并没有受到伤害)。 注意: 1) 结果关系可能包含船舶关系中不存在的船舶。 2)沉船无法参加后期战斗。 3) 由于历史原因,在许多练习中将领头船称为头船。4) 在 Outcomes 表中找到但不在 Ships 表中的船仍被考虑在数据库中。即使沉没也是如此。
这是我提交的答案,它确实生成了正确的结果,但它说“您的查询在主数据库上产生了正确的结果集,但第二次测试失败,正在检查数据库 * 错误的记录数(减 1)":
SELECT DISTINCT C.class, count(result)
FROM classes c JOIN ships s ON
c.class = s.class left join outcomes o on
o.ship = s.name
WHERE result='sunk'
and c.class IN (
SELECT DISTINCT c.class
FROM classes c JOIN ships s ON
c.class = s.class left join outcomes o on o.ship = s.name
GROUP BY c.class
HAVING count(name)>=3)
group by c.class
HAVING count(result) is not NULL
我不确定我哪里出错了://
【问题讨论】:
-
旁注:在用于
IN的子查询上使用DISTINCT充其量是没有意义的,最坏的情况是,可能会诱使优化器做更多的工作而不是必要的工作.a IN (X, Y, Z, Y)和a IN (X, Y, Z)的答案是相同的,因为IN是基于设置的 - 重复无关紧要。 -
无需执行 SELECT DISTINCT,因为您的 GROUP BY 不会返回重复项。
标签: sql