【发布时间】:2014-02-03 13:55:59
【问题描述】:
我正在尝试编写 SQL 查询来解决 www.sql-ex.ru (Q. 32) 上的问题,我得到了正确的结果,但该网站将我的查询验证为不受欢迎的解决方案。 (可能有各种原因:逻辑错误或效率低下等......)
架构
http://www.sql-ex.ru/images/ships.gif
SQL 查询问题:
一艘船的特征之一是其主炮口径(mw)的二分之一立方。在小数点后 2 位以内,定义数据库中每个国家的船舶的 mw 平均值。
关于数据的网站注释
参与二战的海军舰艇数据库正在考虑中。数据库有以下关系: 类(类,类型,国家,numGuns,孔,位移) 船舶(名称、等级、发射) 战斗(名称,日期) 结果(船,战斗,结果) 班级中的船舶被安排到一个项目中。一个类通常被分配给所考虑的类中的第一艘船的名称(头船);否则,类名与数据库中的任何船名不一致。 等级关系包括等级名称、类型(bb 代表战舰,或 bc 代表战列巡洋舰)、建造国家、主炮数量、炮口径(炮管直径,以英寸为单位)和排量(重量,吨)。 Ships 关系包括船名、船级名和发射年份。战斗关系包括舰艇参加的战斗的名称和日期;而他们参与战斗的结果(沉没、受损或安然无恙 - OK)在结果关系中。 注: 1) 结果关系可能包括未包括在船舶关系中的船舶。 2) 沉船之后就不能参加战斗了。
我的查询
SELECT c.country, CAST( AVG(0.5*POWER(c.bore,3.0) ) AS DECIMAL(10,2) )
AS weight FROM
(
SELECT ship FROM Outcomes
INTERSECT
SELECT class FROM Classes
EXCEPT
SELECT class FROM Ships
UNION ALL
SELECT class FROM Ships
) AS cte1
LEFT OUTER JOIN Classes AS c
ON cte1.ship=c.class
GROUP BY country
正确结果
国家权重
德国 1687.50
英国 1687.50
美国 1897.78
我的问题: 鉴于它产生正确的结果,我的查询如何不正确?非常感谢。
【问题讨论】:
-
也许在 sql-ex.ru 上询问会更有意义。
-
绝对正确,但只有在提供正确答案的情况下才能访问论坛上的问题讨论。 :(