まず、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 フィドルのデモ - これらのクエリのクエリ プランを参照してください。