सबसे पहले, आइए प्रत्येक 2 दृष्टिकोणों के पेशेवरों और विपक्षों को देखने का प्रयास करें:
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 डेमो - इन प्रश्नों की क्वेरी योजनाएं देखें।