Първо, нека се опитаме да видим плюсовете и минусите на всеки от двата подхода:
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;
Първият е по-добър, когато го използвате в съединения, особено ако няма да използвате всичките си колони. Например, да кажем, че имате изглед, когато използвате своя vw_Car
:
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;
Сега, ако искате да направите просто изберете:
select Name from vw_people1;
select Name from vw_people2;
Първият би бил прост избор от people
(vw_Car1
изобщо няма да бъде запитван). Вторият ще бъде по-сложен - Ford
и Chevy
и двете ще бъдат заявени. Може да си помислите, че първият подход е по-добър, но нека опитаме друга заявка:
select *
from vw_people1
where Maker = 'Ford' and Model = 'Fiesta';
select *
from vw_people2
where Maker = 'Ford' and Model = 'Fiesta';
Тук вторият ще бъде по-бърз, особено ако имате индекс на Model
колона.
=> демонстрация на sql fiddle - вижте плановете на заявките за тези заявки.