sql dml 练习 19

问题描述 投票:0回答:3

我已经研究这个查询好几次了,我设法找到了一个解决方案,但在练习解决方案本身上,它说我得到了正确数量的结果,但不匹配。

这是他们建议的练习:

假设没有任何两场战斗发生在同一天,则在下一场战斗中击毁的船只在第一次战斗中受损并且没有其他地方参加。如果数据库中不存在与该船相关的以下战斗,请勿将该船插入结果表中。

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

这是数据库说明:

参加二战的海军舰艇数据库正在考虑中。数据库有以下关系:

  • 类别(类别、类型、国家、枪支数量、口径、排量)
  • 船舶(名称、类别、下水)
  • 战斗(姓名,日期)
  • 结果(船舶、战斗、结果)

类别中的船舶被安排到一个项目中。一个类别通常被指定为该类别中第一艘船的名称(头船);否则,该类别名称与数据库中的任何船舶名称都不一致。类别关系包括类别名称、类型(bb 表示战列舰,bc 表示战列巡洋舰)、船舶建造国家、主炮数量、火炮口径(炮管直径,以英寸为单位)以及排水量(重量,以吨为单位)。船舶关系包括船舶名称、类别名称和发射年份。战斗关系涵盖了船只参加的战斗的名称和日期;而他们参与战斗的结果(沉没、受损或未受伤 - 好的)则在结果关系中。

备注:

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

这是表关系http://sql-ex.ru/help/select13.php#db_3

sql join insert-into dml
3个回答
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)

0
投票
INSERT INTO outcomes(ship, battle, result)
SELECT shipName, battleName, 'sunk'
FROM ((SELECT ship as shipName, MIN(date) AS firstBattleDate
       FROM Outcomes o INNER JOIN Battles b ON (o.battle = b.name)
       GROUP BY ship
       HAVING ((COUNT(*) = 1) AND MIN(result) = 'damaged')) x

       INNER JOIN 

       (SELECT name as battleName, date as nextBattleDate FROM Battles) y 

       ON (y.nextBattleDate = (SELECT MIN(date)
                               FROM Battles 
                               WHERE date > x.firstBattleDate))
    )
© www.soinside.com 2019 - 2024. All rights reserved.