mysql - SQL-EX.ru 练习 #36

标签 mysql sql

我正在尝试解决练习 #36,它是在数据库中列出头舰的名称(考虑到结果表)

头舰是该级别排在第一位的舰船的名称(即 2 艘船,但 1 艘先于另一艘 build ,因此第一艘船是“头舰”)。我的结果说我确实说了以下内容:

您的查询在第一个(可用)数据库上返回了正确的数据集,但在第二个检查数据库上返回了错误的数据集。 * 记录数错误(减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) 

类(class)中的船只被安排到一个项目中。一个级别通常指定所考虑级别中第一艘船的名称(首船);否则,类名与数据库中的任何船名都不一致。

类关系包括类名、类型(战列舰为 bb,战列巡洋舰为 bc)、船舶 build 国家、主炮数量、火炮口径(炮管直径,以英寸为单位) ) 和排水量(重量,以吨为单位)。

Ships 关系包括船名、船级名和发射年份。

Battles 关系包含舰船参加的战斗的名称和日期;而他们参与战斗的结果(沉没、受损或未受伤 - 好的)在 Outcomes 关系中。

注意事项:

  1. 结果关系可能包括未包含在船舶关系中的船舶。
  2. 此后沉船不能参加战斗。

现在我的查询返回了正确的答案,但在并集上它没有返回正确的值?我的理解是 Ships 表中不存在其中一个船名,因此我从 Outcomes 中选取它来解决问题。但即使这样也不正确。有什么我想念的吗?

最佳答案

头舰是与其所属级别同名的舰船,我对此进行了研究并且成功了:

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

关于mysql - SQL-EX.ru 练习 #36,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279809/

相关文章:

mysql - MySQL中的变量和@variable有什么区别

mysql - SQL如何按值选择最近的时间戳?

php - 如何将PHP+HTML脚本存储到一个变量中并将该变量插入MySQL数据库?

java - 如何处理 Java 中的读取事务以提供一致性?

sql - 找出字符串中出现次数最多的字符

MySQL:SELECT 重复输入错误...INSERT INTO 带有 UNIQUE 约束

php - MYSQL 到 MYSQLI 转换器

mysql - PHPMyAdmin 中的 SQL 查询未执行,显示错误 #1071

sql - 有自定义年份,而不是日历年

sql - 为什么在 SQL 查询中 NOT IN 比 IN 慢很多