sql >> Database >  >> RDS >> Sqlserver

Een weergave maken van gerelateerde onderliggende tabellen

Laten we eerst eens kijken naar de voor- en nadelen van elk van de twee benaderingen:

create view vw_Car1
as
  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);

create view vw_Car2
as
  select FordId as id, 'Ford' as Maker, Model from Ford
  union all
  select ChevyId as id, 'Chevy' as Maker, Model from Chevy;

De eerste is beter als je hem in joins gebruikt, vooral als je niet al je kolommen gebruikt. Stel dat u bijvoorbeeld een weergave heeft wanneer u uw vw_Car . gebruikt :

create table people (name nvarchar(128), Carid int);

insert into people
select 'John', 1 union all
select 'Paul', 2;

create view vw_people1
as
select
    p.Name, c.Maker, c.Model
from people as p
   left outer join vw_Car1 as c on c.ID = p.CarID;

create view vw_people2
as
select
    p.Name, c.Maker, c.Model
from people as p
   left outer join vw_Car2 as c on c.ID = p.CarID;

Als u nu een eenvoudige keuze wilt maken, selecteert u:

select Name from vw_people1;

select Name from vw_people2;

De eerste is eenvoudig selecteren uit people (vw_Car1 helemaal niet opgevraagd). De tweede zal ingewikkelder zijn - Ford en Chevy zullen beide worden bevraagd. Je zou kunnen denken dat de eerste benadering beter is, maar laten we een andere vraag proberen:

select *
from vw_people1
where Maker = 'Ford' and Model = 'Fiesta';

select *
from vw_people2
where Maker = 'Ford' and Model = 'Fiesta';

Hier zal de tweede sneller zijn, vooral als je een index hebt op Model kolom.

=> sql fiddle-demo - bekijk de zoekopdrachtplannen van deze zoekopdrachten.




  1. Een UPDATE Pass-Through-query uitvoeren in SQL Server

  2. orakel waar beperkt tot 1000 / winterslaap

  3. sql-triggers Ik heb een fout bij het opslaan van de kolomnaam in variabele en gebruik deze voor OLD.myvar in sql-triggers

  4. Identiteitsachtige kolom maar gebaseerd op Group By-criteria