Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tworzenie widoku z powiązanych tabel podrzędnych

Przede wszystkim spróbujmy zobaczyć zalety i wady każdego z 2 podejść:

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;

Pierwszy z nich jest lepszy, gdy używasz go w sprzężeniach, zwłaszcza jeśli nie będziesz używać wszystkich swoich kolumn. Załóżmy na przykład, że masz widok, gdy używasz swojego 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;

Teraz, jeśli chcesz zrobić to po prostu, wybierz:

select Name from vw_people1;

select Name from vw_people2;

Pierwszy to prosty wybór spośród people (vw_Car1 w ogóle nie będzie odpytywany). Drugi będzie bardziej złożony - Ford i Chevy będą oba zapytania.Możesz pomyśleć, że pierwsze podejście jest lepsze, ale spróbujmy innego zapytania:

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

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

Tutaj drugi będzie szybszy, zwłaszcza jeśli masz indeks na Model kolumna.

=> prezentacja skrzypiec sql - zobacz plany zapytań tych zapytań.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawić, by rozszerzenie SQLSRV działało z PHP, skoro MSSQL jest przestarzały?

  2. Użyj certyfikatu SQL z innej bazy danych

  3. Utrata precyzji liczbowej serwera SQL 2005

  4. Jak skutecznie usuwać wiersze, nie używając przycinania tabeli w tabeli ponad 500 000 wierszy?

  5. tożsamość z sql insert przez jdbctemplate