Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo chế độ xem từ các bảng con có liên quan

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 - FordChevy 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết hợp (nối) ngày và giờ thành một ngày giờ

  2. SQL động so với thủ tục được lưu trữ

  3. IIF (...) không phải là một chức năng tích hợp sẵn được công nhận

  4. Cách khắc phục “câu lệnh ALTER TABLE SWITCH không thành công”

  5. Làm cách nào để tuần tự hóa một đồ thị lớn của đối tượng .NET thành BLOB SQL Server mà không cần tạo bộ đệm lớn?