2015-06-03 44 views
-2

我一直在研究這個查詢幾次,我設法找到一個解決方案,但在練習解決方案本身,它說我得到了正確數量的結果,但不匹配。sql dml練習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) 

這是數據庫描述:

,在參加海軍艦艇數據庫第二次世界大戰正在考慮之中。該數據庫具有以下關係:

  • 類(類,類型,國家,numGuns,缸徑,排量)
  • 船舶(姓名,班級,推出)
  • 戰役(名稱,日期)
  • 結果(船舶,戰鬥,結果)

船上的班級安排到一個單一的項目。一個班級通常被分配考慮中的班級中的第一艘船的名字(頭船);否則,班級名稱與數據庫中的任何船名不一致。 Classes關係包括班級名稱,類型(戰鬥艦的bb或戰鬥巡洋艦的bc),建造船的國家,主炮的數量,炮管口徑(槍管的直徑,以英寸爲單位)以及排水量(以噸計)。船舶關係包括船名,船級名稱和發射年份。戰鬥關係涵蓋船隻參與戰鬥的名稱和日期;而他們參與戰鬥的結果(沉沒,損壞或未受傷 - 確定)在結果關係中。

注:

  1. 成果的關係可能包括不包括船舶關係的船隻。
  2. 此後沉沒的船隻不能參與戰鬥。

這裏是表關係http://sql-ex.ru/help/select13.php#db_3

+1

除其他外,你應該改變問題的名稱,以便更清楚其他你在問什麼。 –

+1

我不知道這是否只是我,但我不明白重要的粗體部分。有什麼機會可以修正這個語言? – sstan

+0

- 同一天內沒有兩場戰鬥 - 如果船舶受損並且不在以後的戰鬥中,則將其插入結果表中,並在下一次戰鬥中將結果「沉沒」。 - 如果下一場戰鬥不在數據庫中,則不插入 –

回答

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)