【问题标题】:sql dml exercise 19sql dml练习19
【发布时间】:2015-08-18 02:42:19
【问题描述】:

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

这是他们建议的练习:

假设没有任何两场战斗是在同一天,在下一场战斗中击毁船只,在第一场战斗中他们的战斗被损坏并且没有其他地方参与。如果数据库中没有关于这艘船的以下战斗,请不要将这艘船插入到结果表中。

您的查询在第一个(可用)上返回了正确的数据集 数据库,但在第二次检查时返回了不正确的数据集 数据库。 * 数据不匹配 (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 代表战列巡洋舰)、建造国家、主炮数量、炮口径(炮管直径,以英寸为单位)和排量(重量,吨)。 Ships 关系包括船名、船级名和发射年份。战斗关系包括舰艇参加的战斗的名称和日期;而他们参与战斗的结果(沉没、受损或安然无恙 - OK)在结果关系中。

注意事项:

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

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

【问题讨论】:

  • 除其他外,您应该更改问题的名称,以便其他人更清楚您的问题。
  • 不知道是不是只有我一个人,但是我看不懂加粗的重要部分。有没有机会稍微修正一下语言?
  • - 没有两场战斗是在同一天进行的- 如果船损坏并且不在以后的任何战斗中,则在下一场战斗中将船插入结果表,结果为“沉没”。 -如果下一场战斗不在数据库中,则不插入

标签: sql join insert-into dml


【解决方案1】:

没有其他地方参与

那艘船只参加了一场战斗,那是它受损的那场。

【讨论】:

    【解决方案2】:

    这样一个令人困惑的问题。希望这会有所帮助:

    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)
    

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2014-11-01
      • 2015-07-24
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多