我一直在研究这个问题,我设法找到了一个解决方案但是在运动解决方案本身上它表示我得到了正确的结果数但不匹配。
这是他们提出的练习:
假设在同一天没有任何两场战斗,在下一场战斗中破坏了这些战斗,这些战斗在第一场战斗中受到了破坏,而其他任何地方都没有参战。如果数据库中没有关于该船的以下战斗,请不要将该船插入结果表。
您的查询在第一个(可用)上返回了正确的数据集 数据库,但它在第二次检查时返回了不正确的数据集 数据库。 *数据不匹配(162)
这是我写的查询:
insert into outcomes
select
ship, b.name, 'sunk' from
(select ship, name, date from outcomes o
inner join battles bv
on o.battle = bv.name
where result = 'damaged'
and date = (select max(date)
from outcomes os
inner join battles ba
on os.battle = ba.name
where os.ship = o.ship)
) aq cross join battles b
where b.date = ( select min(date) from battles where date > aq.date)
这是数据库描述:
正在考虑参加第二次世界大战的海军舰艇数据库。该数据库具有以下关系:
课程中的船舶安排在一个项目中。通常会为一类人员分配正在考虑的类别中的第一艘船的名称(船头);否则,类名与数据库中的任何船名不一致。 Classes关系包括班级名称,类型(战斗船的bb,战斗巡洋舰的bc),建造船舶的国家,主炮的数量,枪口径(枪管的直径,以英寸为单位),以及排量(重量以吨计)。船舶关系包括船名,船级名称和发射年份。战斗关系包括船舶参与战斗的名称和日期;虽然他们参加战斗的结果(沉没,受损或没有受伤 - 确定)属于结果关系。
注意:
答案 0 :(得分:1)
其他地方没有参加
那艘船只参加了一场战斗,那场战斗已经损坏了。
答案 1 :(得分:0)
这样一个令人困惑的问题。希望这会有所帮助:
INSERT INTO Outcomes
SELECT ship, next, 'sunk'
FROM Outcomes
LEFT JOIN
(SELECT a.first, b.next FROM
(SELECT ROW_NUMBER() OVER(ORDER BY date ASC)+1 AS nxt, name AS first, date
FROM Battles) a
LEFT JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY date ASC) AS rnk, name AS next, date
FROM Battles) b
ON a.nxt = b.rnk) sub
ON Outcomes.battle = sub.first
WHERE Outcomes.result = 'damaged'
AND Outcomes.ship NOT IN
(SELECT Outcomes.ship
FROM Outcomes
WHERE Outcomes.result = 'sunk')
AND Outcomes.ship NOT IN
(SELECT Outcomes.ship
FROM Outcomes
GROUP BY Outcomes.ship
HAVING COUNT(Outcomes.ship)>1)