2017-01-03 127 views
1

This is the Database schema該系統顯示我得到了正確的答案,但即時通訊錯誤邏輯?繼承人數據庫描述: 正在考慮參加第二次世界大戰的海軍艦艇數據庫。該數據庫由以下關係:sql-ex錯誤的正確答案

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

船上的班級都具有相同的總體設計。通常根據相應的設計爲一個類別分配第一艘船的名稱,或者與數據庫中的任何船名不同的名稱。名字被分配到一個班級的船被稱爲主導船。 Classes關係包括班級名稱,類型(可以是戰鬥艦的bb,也可以是戰鬥巡洋艦的bc),船的內置國家,主炮數量,槍口徑(孔徑以英寸)和排水量(重量以噸計)。船舶關係保存關於船名,相應艙級名稱和船舶啓動年份的信息。戰鬥關係包含船隻參與戰鬥的名稱和日期,以及結果關係 - 給定船隻的戰鬥結果(可能是沉沒,損壞或OK,這是最後一個值,表示船隻在戰鬥中倖免於難)。

問題是:對於參加瓜達爾卡納爾海戰役的每艘船來說,得到它的名字,位移和槍支數量。

這裏是我的代碼什麼是我的代碼錯了?

select ships.name, displacement, numguns from battles 

full outer join outcomes on battles.name=outcomes.battle 
full outer join ships on ships.name=outcomes.ship 
full outer join classes on classes.class=ships.class 

where battles.name = 'Guadalcanal' 

回答

0

首先,根據您提供的圖像,在您的查詢中表名是錯誤的。

其次,除非你真的需要,只需使用常規連接(INNER JOIN,關鍵字連接是內連接

三在列選擇,把表名進行的所有領域,並確保該表名同樣的,不是強制性的,但好的做法,加入許多表,並選擇了大量數據時尤其如此。

0

你的SQL可以使用INNER JOIN

聯接表之間可以讀做here

例如:

SELECT a.name, c.displacement, c.numGuns 
FROM Ships a 
INNER JOIN Outcomes b ON a.name = b.ship 
INNER JOIN Battles c ON b.battle=c.name 
INNER JOIN Classes d ON a.class=d.class 
WHERE c.name = 'Guadalcanal' 
2

您需要使用LEFT JOIN這裏,以考慮其不具有類船舶。

SELECT ship , 
      c.displacement , 
      c.numguns 
    FROM  (SELECT o.ship , 
         COALESCE(s.class, o.ship) class 
       FROM  outcomes o 
         INNER JOIN Battles b ON o.battle = b.name 
         LEFT JOIN ships s ON s.name = o.ship 
       WHERE  b.name = 'Guadalcanal' 
      ) s 
      LEFT JOIN classes c ON c.class = s.class;