簡體   English   中英

從相關子表創建視圖

[英]Creating View from Related Child Tables

我具有以下常規表結構(在我的作過的示例中原諒了以美國為中心的汽車制造商):

CREATE TABLE Car (
    [Id] int PRIMARY KEY
)

CREATE TABLE Ford (
    [FordId] int PRIMARY KEY, --also a foreign key on Car
    [Model]  nvarchar(max)
)

CREATE TABLE Chevy (
    [ChevyId] int PRIMARY KEY, --also a foreign key on Car
    [Model]  nvarchar(max)
)

我想在這些表的頂部創建一個視圖,以便可以檢索所有Fords和Chevys,並在視圖中僅包含一個生成的列來告訴我。 我的第一個刺是:

SELECT 
    c.CarId,
    case when f.FordId is not null then 'Ford' else 'Chevy' end 
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)

但這會使我口中難聞,我擔心表現。 我會更好地以單獨的CTE值檢索所有的福特和雪佛蘭,然后對它們進行聯合嗎? 我完全走錯了軌道嗎? 我還將需要包括Model列(以及兩個子表共有的其他一些列),這顯然會使我的觀點變成一系列case語句。 處理這種情況的“正確”方法是什么?

編輯 :以為我應該補充一點,該架構已經存在,因此無法更改基礎表。

首先,讓我們嘗試看看兩種方法各自的優缺點:

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不會查詢vw_Car1 )。 第二個將更復雜- FordChevy將被同時查詢。 您可能認為第一種方法更好,但讓我們嘗試另一個查詢:

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

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

這里第二個會更快,特別是如果您在“ Model列上有索引。

=> sql fiddle演示 -請參閱這些查詢的查詢計划。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM