SQL-EX.ru练习#36

时间:2015-05-16 19:21:10

标签: mysql sql

我正在尝试解决第36项练习列出数据库中头部船舶的名称(考虑到结果表)

船首是该级别首先排队的船舶的名称(即2艘船舶,但在另一艘船舶之前建造1艘,因此第一艘船舶是#34;船舶船舶#34;)。我的结果说我确实说了以下内容:

您的查询在第一个(可用)数据库上返回了正确的数据集,但它在第二个检查数据库上返回了不正确的数据集。 *错误的记录数量(少于1)

我的查询如下:

SELECT A.name FROM Ships A
WHERE A.name = A.class
AND A.launched = (SELECT MIN(B.launched) FROM Ships B
              WHERE A.name = B.name
              AND A.class = B.class)
UNION ALL
SELECT A.ship
FROM Outcomes A
WHERE A.ship IN (SELECT C.ship FROM Outcomes C, Classes D
                 WHERE C.ship IN (SELECT ship FROM Outcomes)
                 AND C.ship NOT IN (SELECT name FROM Ships)
                 AND C.ship = D.class
                 )

数据库设置如下:

正在考虑参加第二次世界大战的海军舰艇数据库。

数据库具有以下关系:

Classes(class, type, country, numGuns, bore, displacement) 
Ships(name, class, launched) 
Battles(name, date) 
Outcomes(ship, battle, result) 

课程中的船舶安排在一个项目中。通常会为一类人员分配正在考虑的类别中的第一艘船的名称(船头);否则,类名与数据库中的任何船名不一致。

Classes关系包括班级名称,类型(战斗舰的bb或战斗巡洋舰的bc),建造船舶的国家,主炮数量,枪口径(枪管直径,英寸) )和排水量(重量以吨计)。

船舶关系包括船名,类名和发射年份。

战斗关系包括船舶参与战斗的名称和日期;而他们参与战斗的结果(沉没,受损或无伤害 - 好的)是在结果关系中。

注意:

  1. 结果关系可能包括未包含在船舶关系中的船舶。
  2. 沉船在此之后不能参加战斗。
  3. 现在我的查询返回正确的答案但是在联合上它没有返回正确的值?我的理解是其中一个船名不存在于船舶表中,所以我从Outcomes中提取它以解决问题。但即使这样也不正确。有什么我想念的吗?

3 个答案:

答案 0 :(得分:0)

头船是与它们所属的类同名的船只,我的工作机智并且有效:

WITH union1 (name) AS
    (SELECT name FROM ships WHERE name = class
     UNION SELECT ship AS name FROM outcomes 
     INNER JOIN classes ON classes.class = outcomes.ship)
SELECT DISTINCT name FROM union1

答案 1 :(得分:0)

更简单的解决方案:

select name from ships where name IN (select class from classes)
UNION
select ship from outcomes where ship IN (select class from classes)

答案 2 :(得分:0)

Select name from ships where name = class
union
select ship from outcomes join classes on outcomes.ship = classes.class