我正在尝试编写SQL查询来解决www.sql-ex.ru(问题32)上的问题,我得到了正确的结果,但是该网站将我的查询验证为不受欢迎的解决方案。(可能出于各种原因:逻辑错误或效率低下等)
模式
http://www.sql-ex.ru/images/ships.gif
SQL查询问题:
船舶的特征之一是其主炮(mw)口径的一半。在2个小数位内,定义数据库中有船的每个国家/地区的船的mw平均值。
网站上的数据注释
正在考虑参加第二次世界大战的海军舰船数据库。该数据库具有以下关系:类(类,类型,国家/地区,数量,孔,位移)船(名称,类,发射的)战役(名称,日期)结果(船,战役,结果)单个项目。通常为一个船级分配所考虑的船级中的第一艘船的名称(总船);否则,类名与数据库中的任何船名都不匹配。“类别”关系包括类别名称,类型(战舰为bb,战舰为bc),战舰制造国家/地区,主炮数量,枪口径(枪管直径,以英寸为单位)和排量(以吨为单位的重量)。船舶关系包括船舶名称,类别名称和发射年份。战役关系涵盖了舰只参加战斗的名称和日期;而他们参与战斗的结果(沉没,损坏或未受伤害-可以)与结果相关。注意: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
Run Code Online (Sandbox Code Playgroud)
正确结果
国家重量
德国1687.50
英国山1687.50
美国1897.78
我的问题: 鉴于查询会产生正确的结果,我的查询不正确吗?非常感谢。
小智 0
SELECT COUNTRY, CONVERT(NUMERIC(10,2),AVG(BORE*BORE*BORE/2)) WEIGHT
FROM (SELECT COUNTRY,BORE,NAME
FROM CLASSES
RIGHT JOIN SHIPS ON SHIPS.CLASS = CLASSES.CLASS
UNION
SELECT DISTINCT COUNTRY, BORE, SHIP
FROM CLASSES C
LEFT JOIN OUTCOMES O ON O.SHIP = C.CLASS
WHERE NOT EXISTS(SELECT NAME
FROM SHIPS
WHERE NAME = O.SHIP) AND
NOT (SHIP IS NULL)
)T
GROUP BY COUNTRY
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3004 次 |
| 最近记录: |