Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създаване на изглед от свързани дъщерни таблици

Първо, нека се опитаме да видим плюсовете и минусите на всеки от двата подхода:

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 - вижте плановете на заявките за тези заявки.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Метаданни на SQL Server в intellisense?

  2. Генерирайте MD5 хеш низ с T-SQL

  3. Ред на изпълнение на SQL заявката

  4. Разделете един дълъг низ със запетая в многоколонна нова таблица

  5. Грешка в SQL сървъра:низови или двоични данни ще бъдат съкратени