I begyndelsen har vi dette -- som er ret rodet.
For at rydde lidt op tilføjer jeg to visninger og et synonym:
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
Og nu ser modellen sådan ud
Det er nemmere nu at skrive forespørgslen
;
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) ;
Der er et åbenlyst mønster i denne forespørgsel, så den kan oprettes som dynamisk sql, hvis du skal tilføje en anden modul-type tabel. Når du tilføjer en anden tabel, skal du bruge ID
og Title
for at undgå at skulle bruge en udsigt.
REDIGER
At bygge dynamisk sql (eller forespørgsel på applikationsniveau)
Rediger linje 6 og 7, x-indekset er tb_modules.id
coalesce(x1. , x2. , x3. ..)
Tilføj linjer til venstre sammenføjning (under linje 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
SomeName
er tb_modules.description
og x-index matcher tb_modules.id
REDIGERING 2
Det enkleste ville sandsynligvis være at pakke ovenstående forespørgsel ind i en visning og derefter hver gang skemaet ændres dynamisk kasse og køre ALTER VIEW
. På denne måde ville forespørgslen ikke ændre sig fra applikationens punkt.