Lúc đầu, chúng ta có cái này - khá lộn xộn.
Để làm rõ một chút, tôi thêm hai chế độ xem và một từ đồng nghĩa:
create view v_Value as
select
ID as ValueID
, tb_modules_ID as ModuleID
, usertype_OR_religion_ID as RemoteID
from tb_value ;
go
create view v_Religion as
select
ID
, ReligionName as Title
from tb_religion ;
go
create synonym v_UserType for tb_UserType ;
go
Và bây giờ mô hình trông giống như
Giờ đây, viết truy vấn dễ dàng hơn
;
with
q_mod as (
select
m.ID as ModuleID
, coalesce(x1.ID , x2.ID) as RemoteID
, coalesce(x1.Title , x2.Title) as Title
, m.Description as ModuleType
from tb_Modules as m
left join v_UserType as x1 on m.TableName = 'tb_UserType'
left join v_Religion as x2 on m.TableName = 'tb_Religion'
)
select
a.ModuleID
, v.ValueID
, a.RemoteID
, a.ModuleType
, a.Title
from q_mod as a
join v_Value as v on (v.ModuleID = a.ModuleID and v.RemoteID = a.RemoteID) ;
Có một mẫu rõ ràng trong truy vấn này, vì vậy nó có thể được tạo dưới dạng sql động nếu bạn phải thêm một bảng kiểu mô-đun khác. Khi thêm một bảng khác, hãy sử dụng ID
và Title
để tránh phải sử dụng chế độ xem.
CHỈNH SỬA
Để tạo sql động (hoặc truy vấn ở cấp ứng dụng)
Sửa đổi dòng 6 và 7, chỉ số x là tb_modules.id
coalesce(x1. , x2. , x3. ..)
Thêm dòng vào phần nối bên trái (bên dưới dòng 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
SomeName
là tb_modules.description
và x-index khớp với tb_modules.id
CHỈNH SỬA 2
Đơn giản nhất có thể là gói truy vấn ở trên vào một dạng xem và sau đó mỗi khi lược đồ thay đổi thùng động và chạy ALTER VIEW
. Bằng cách này, truy vấn sẽ không thay đổi so với điểm của ứng dụng.