まず、2 つのアプローチのそれぞれの長所と短所を見てみましょう:
create view vw_Car1as SELECT c.Id, case when f.FordId is not null then 'Ford' else 'Chevy' end as Maker, coalesce(f.Model, ch.Model) as Model FROM Car as c LEFT JOIN Ford as f on c.Id =f.FordId LEFT JOIN Chevy as ch on c.Id =ch.ChevyId WHERE (f.FordId is not null or ch.ChevyId is not null); ビューを作成 vw_Car2as id として FordId を選択、メーカーとして「フォード」、フォード ユニオンからのモデルはすべて、id として ChevyId、メーカーとして「シボレー」、シボレーからのモデルを選択します。
プレ>結合で使用する場合、特にすべての列を使用しない場合は、最初のものの方が適しています。たとえば、
vw_Car
を使用しているときにビューがあるとします。 :create table people (name nvarchar(128), Carid int);insert into peopleselect 'John', 1 union allselect 'Paul', 2;ビューを作成 vw_people1asselect p.Name, c.Maker, c.Modelfrom people as p left outer join vw_Car1 as c on c.ID =p.CarID;ビューの作成 vw_people2asselect p.Name, c.Maker, c.Modelfrom people as p left outer join vw_Car2 as c on c.ID =p.CarID; コード> プレ>
ここで、単純な選択を行いたい場合:
vw_people1 から名前を選択;vw_people2 から名前を選択;
プレ>最初は
people
から選択するだけです (vw_Car1
まったく照会されません)。 2 つ目はより複雑になります -Ford
そしてシボレー
最初のアプローチの方が優れていると思うかもしれませんが、別のクエリを試してみましょう:select *from vw_people1where Maker ='Ford' and Model ='Fiesta';select *from vw_people2where Maker ='Ford' and Model ='Fiesta';
プレ>ここでは、特に
Model
にインデックスがある場合は、2 番目の方が高速になります。=> SQL フィドルのデモ - これらのクエリのクエリ プランを参照してください。