私は練習に続き、http://www.sql-ex.ru/learn_exercises.phpです。sql-ex.ru文章練習を選択する51
エクササイズ51では、「同じ結果を出したすべての船舶(累計結果表の船舶を含む)の中で銃の数が最も多い船の名前を見つける」と尋ねる。
これは私のコードですが、それは第一見デシベルを渡しますが、第二に合格しない、目に見えない、デシベル(エラーがある - 「3によって少ない」):
with t1 as
(select displacement, max(numguns) 'guns' from classes group by displacement),
t2 as
(select class from classes, t1 where classes.displacement = t1.displacement and classes.numguns = t1.guns)
select name from ships, t2 where ships.class = t2.class
union
select ship from outcomes, t2 where outcomes.ship = t2.class
私が使用するロジックdbの変位と銃の数がClassesである唯一のテーブルなので、t1とt2はクラス名を抽出して、これらのクラスに属する名前をshipとoutcomesテーブルから取得するだけです。
エラーが発生する理由がわかりません。
EDITは:クラスでのnull値のチェックを追加しました、と私は第二目に見えないデシベルに新しいエラーを取得 - 「データの不一致(11)」:データベースの説明になります場合は
with t1 as
(select displacement, max(numguns) 'guns' from classes group by displacement),
t2 as
(select class from classes, t1 where (classes.displacement = t1.displacement or classes.displacement is null) and (classes.numguns = t1.guns or classes.numguns is null))
select name from ships, t2 where ships.class = t2.class
union
select ship from outcomes, t2 where outcomes.ship = t2.class
出力は、これは動作します。クラスに値を持たなくても、クラスに参加して変位とガンガンを見つける前に、船と結果を組合わせる必要があるかもしれないと思います。すなわち、クラスとの結合の後に、それらの変位およびnumgunの値は「null」となる。私は正しいですか? –
@DavidRefaeliそれの背後にある別のロジックがあります。私の更新された記事の説明を見てください。 – Vasily