Pada awalnya kami memiliki ini -- yang cukup berantakan.
Untuk membersihkan sedikit saya menambahkan dua tampilan dan sinonim:
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
Dan sekarang modelnya terlihat seperti
Sekarang lebih mudah untuk menulis kueri
;
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) ;
Ada pola yang jelas dalam kueri ini, sehingga dapat dibuat sebagai sql dinamis jika Anda harus menambahkan tabel tipe modul lain. Saat menambahkan tabel lain, gunakan ID
dan Title
untuk menghindari keharusan menggunakan tampilan.
EDIT
Untuk membangun sql dinamis (atau kueri pada tingkat aplikasi)
Ubah baris 6 dan 7, x-indexnya adalah tb_modules.id
coalesce(x1. , x2. , x3. ..)
Tambahkan baris ke kiri bergabung (di bawah baris 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
SomeName
adalah tb_modules.description
dan x-index cocok dengan tb_modules.id
EDIT 2
Yang paling sederhana mungkin adalah mengemas kueri di atas ke dalam tampilan dan kemudian setiap kali skema berubah secara dinamis, buat dan jalankan ALTER VIEW
. Dengan cara ini kueri tidak akan berubah dari sudut pandang aplikasi.