2016-10-18 1 views
0

私は練習に続き、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 

答えて

1

をあなたはこれを見るでしょう:

すべてのクラスの船は、同じ一般的なデザインを持っています。 クラスは、通常、 で、 対応のデザインに従ってを構築した最初の船の名前、またはデータベース内の任意の船名 と異なる名前を割り当てられています。 クラスに名前が割り当てられている船舶は リード船と呼ばれます。だ

outcomesテーブル5月には、名前が表classesにクラスとして使用されネームシップが含まれていることを意味します。だからunionshipの名前とクラスから名前と名前がoutcomesから再びlead shipに、名前と同じクラスがあるため、名前とクラスが必要です。

ので、あなたは、このクエリまたは背後に同じロジックで同様に使用することができます。

enter image description here

+0

WITH cte AS (SELECT A.name , C.numGuns , C.displacement FROM (SELECT S.name , S.class FROM dbo.Ships AS S UNION SELECT O.ship , O.ship FROM dbo.Outcomes AS O ) AS A JOIN dbo.Classes AS C ON A.class = C.class ) SELECT cte.name FROM cte JOIN (SELECT cte.displacement , MAX(cte.numGuns) AS MaxNumGun FROM cte GROUP BY cte.displacement ) AS M ON cte.displacement = M.displacement AND cte.numguns = M.MaxNumGun 

出力は、これは動作します。クラスに値を持たなくても、クラスに参加して変位とガンガンを見つける前に、船と結果を組合わせる必要があるかもしれないと思います。すなわち、クラスとの結合の後に、それらの変位およびnumgunの値は「null」となる。私は正しいですか? –

+0

@DavidRefaeliそれの背後にある別のロジックがあります。私の更新された記事の説明を見てください。 – Vasily