sql >> データベース >  >> RDS >> Sqlserver

関連する子テーブルからのビューの作成

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




    1. リモートSQLServerデータベースへの接続に関する従来のASPの問題

    2. REPLACE INTOクエリは良い習慣ですか?

    3. 修正方法:プールを使用しているときにjdbc:mysql:// localhost / dbnameエラーに適したドライバーが見つかりませんか?

    4. GORMで外部キーが生成されないのはなぜですか?