【问题标题】:How to SQL DML - sql-ex.ru exercise 18如何 SQL DML - sql-ex.ru 练习 18
【发布时间】: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) 沉船之后就不能参加战斗了。

这是表格关系 http://sql-ex.ru/help/select13.php#db_3

【问题讨论】:

  • 如果不了解这些表格的更多信息,很难告诉您您做错了什么。如果您可以发布表结构和一些示例数据,您将更有可能获得一些帮助。话虽如此,我觉得很奇怪的一件事是加入ships.nameclasses.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


【解决方案1】:
insert into ships 
select ship name,class,launched from
(select distinct ship,c.class,country 
from outcomes o join classes c on c.class=o.ship 
where ship not in(select distinct name from ships)) f join 
(select country,round(avg(launched*1.0),0) launched 
from ships s join classes c on c.class=s.class 
group by country) n on f.country = n.country
where n.launched is not null

【讨论】:

  • 比我的简单得多,而且效果很好,非常感谢。真的,我不得不使用联合。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 2015-08-18
  • 2014-11-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多