2017-01-03 15 views
1

This is the Database schemaシステムは正しい答えを得たが、論理的に間違っていることを示していますか? データベースの説明Heires: 第2次世界大戦に参加した海軍の船舶データベースが検討中です。データベースには、以下の関係で構成されていますsql-ex不適切な正解

  • クラス(クラス、タイプ、国、numGuns、ボア、変位)
  • 船舶(名前、クラス、発売)
  • 戦い(名前、日付)
  • 結果(船舶、戦闘、結果)

クラス内の船舶はすべて同じ一般設計です。クラスには通常、対応するデザインに従って作成された最初の船の名前、またはデータベース内の任意の船名とは異なる名前が割り当てられます。名前がクラスに割り当てられている船を艦船と呼びます。 Classesの関係には、クラス名、タイプ(バトル船の場合はbb、バトルクルーザの場合はbc)、船が建造された国、メインガンの数、ガン口径(インチ単位のボア直径)、および変位(トン数)である。船舶の関係は、船名、船級に対応する船名、船舶が発進した年の情報を保持します。バトルズの関係には、船舶が参加した戦闘の名前と日付、結果の関係が含まれています(特定の船舶の戦闘結果(沈没、破損、またはOK、船舶が無傷の戦闘から生き残ったことを意味する最後の値)。

質問は次のとおりです:Guadalcanal戦闘に参加した各船舶の名前、移動、銃の数を取得します。

ここで私のコードは私のコードで間違っていますか?

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を、定期的に参加使用する必要がない場合

第二には、キーワードJOINは、内側には、お使いの列選択に

サード

に参加するすべてのフィールドのテーブル名を入れて、テーブル名があることを確認しています多くのテーブルを結合し、大量のデータを選択する。

0

あなたのSQLはINNER JOIN

テーブルがhere

を読み取ることができます間の結合を使用して行うことができ、特に同じ。必須なく、よくない習慣、 210

例えば:

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を使用する必要があるが、クラスを持っていない船を検討するために、ここに登録しよう。

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;