Trước hết, chúng ta hãy thử xem ưu và nhược điểm của từng phương pháp trong số 2 cách tiếp cận:
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;
Cái đầu tiên tốt hơn khi bạn sử dụng nó trong các phép nối, đặc biệt nếu bạn sẽ không sử dụng tất cả các cột của mình. Ví dụ:giả sử bạn có một chế độ xem khi đang sử dụng vw_Car
của mình :
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;
Bây giờ, nếu bạn muốn đơn giản, hãy chọn:
select Name from vw_people1;
select Name from vw_people2;
Đầu tiên, đơn giản là chọn từ people
(vw_Car1
sẽ không được truy vấn ở tất cả). Cái thứ hai sẽ phức tạp hơn - Ford
và Chevy
Cả hai sẽ được truy vấn.Bạn có thể nghĩ rằng cách tiếp cận đầu tiên tốt hơn, nhưng hãy thử một truy vấn khác:
select *
from vw_people1
where Maker = 'Ford' and Model = 'Fiesta';
select *
from vw_people2
where Maker = 'Ford' and Model = 'Fiesta';
Ở đây, cái thứ hai sẽ nhanh hơn, đặc biệt nếu bạn có chỉ mục trên Model
cột.
=> sql fiddle demo - xem kế hoạch truy vấn của những truy vấn này.