【发布时间】:2015-07-24 11:09:38
【问题描述】:
我已经在这个查询上工作了一段时间,我设法找到了一个解决方案,但在练习解决方案本身上,它说我得到了正确数量的结果,但缺少一些东西。
这是他们建议的练习。
您应该从 Outcomes 表中添加 Ships 表中不存在的所有主舰(类中的第一艘)。
下水年是某艘国家船舶的平均指数,精度在 1 年内。
如果此平均年份未知,则不得将记录插入表中。
“您的查询在第一个(可用)数据库上返回了正确的数据集,但在第二个检查数据库上返回了不正确的数据集。 * 错误的记录数(少 12 条)”,这是他们给我的提示。 “如果她参加了几场战斗,请检查您是否多次添加同一艘船。”
这是我写的查询:
insert into ships
select
ship, classes.class,
(select round(avg(1.0 * launched), 0, 0)
from ships
join classes on ships.name = classes.class
where
launched is not null
group by country) as l_avgo
from
outcomes
join
classes on outcomes.ship = classes.class
where
not exists (select name from ships )
group by
outcomes.ship, classes.class, classes.country
having
count(ship) = 1
union
select
name, ships.class, round(avg(1.0 * launched), 0, 0) as l_avgs
from
ships
join
outcomes on ships.name = outcomes.ship
where
launched is not null
group by
ships.name, ships.class
这是数据库描述
参与二战的海军舰艇数据库正在考虑中。数据库有以下关系:
- 类(类、类型、国家、数量、口径、位移)
- 船舶(名称、等级、发射)
- 战斗(名称,日期)
- 结果(船、战斗、结果)
类中的船舶被安排到一个项目中。一个类通常被分配给所考虑的类中的第一艘船的名称(头船);否则,类名与数据库中的任何船名不一致。 等级关系包括等级名称、类型(bb 代表战舰,或 bc 代表战列巡洋舰)、建造国家、主炮数量、炮口径(炮管直径,以英寸为单位)和排量(重量,吨)。 Ships 关系包括船名、船级名和发射年份。战斗关系包括舰艇参加的战斗的名称和日期;而他们参与战斗的结果(沉没、受损或安然无恙 - OK)在结果关系中。 注: 1) 结果关系可能包括未包括在船舶关系中的船舶。 2) 沉船之后就不能参加战斗了。
【问题讨论】:
-
如果不了解这些表格的更多信息,很难告诉您您做错了什么。如果您可以发布表结构和一些示例数据,您将更有可能获得一些帮助。话虽如此,我觉得很奇怪的一件事是加入
ships.name和classes.class。我希望ships.name保存船的名称,classes.class保存船类的名称(“驱逐舰”、“巡洋舰”等)。另外,为什么union all?为什么不使用WHERE子句过滤 Union All? -
好的,所以我更新了信息和代码,因为我做了一个新的查询,但仍然遇到同样的问题。所以加入 ship.name = classes.class 是主船的名称,正如您在描述中看到的那样,这些就是他们想要的。关于联合,是的,除了一个简单的联合之外,不需要做联合,但是为什么我看不到需要它的 WHERE 子句我应该做什么验证或过滤?
-
好的,我想我看到了 3 个要求。 1) 船必须在 Outcomes 表中,但不在 Ships 表中。 2) 该船必须是主船。 3)您必须能够计算“平均年份”。我对这个第三个要求有点困惑。我认为您应该从
Ships.launched计算班级“国家”中每艘船的平均年份。那是对的吗? (如果是的话,看起来真的很奇怪。) -
是的,就是这样,平均推出年份就是这样。除非它是空的,否则它们不会添加到船舶表中。
标签: sql join union insert-into dml