In het begin hebben we dit -- wat nogal rommelig is.
Om een beetje op te ruimen, voeg ik twee views en een synoniem toe:
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
En nu ziet het model eruit als
Het is nu gemakkelijker om de vraag te schrijven
;
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) ;
Er is een duidelijk patroon in deze query, dus het kan worden gemaakt als dynamische sql als u nog een tabel van het moduletype moet toevoegen. Gebruik bij het toevoegen van een andere tabel ID
en Title
om te voorkomen dat u een weergave moet gebruiken.
BEWERKEN
Dynamische sql bouwen (of query op applicatieniveau)
Pas regels 6 en 7 aan, de x-index is tb_modules.id
coalesce(x1. , x2. , x3. ..)
Voeg regels toe aan de linker join (onder regel 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
De SomeName
is tb_modules.description
en x-index komt overeen met tb_modules.id
BEWERK 2
De eenvoudigste zou waarschijnlijk zijn om de bovenstaande query in een weergave te verpakken en vervolgens elke keer dat het schema dynamisch verandert, te kratten en ALTER VIEW
uit te voeren. . Op deze manier zou de vraag niet veranderen vanaf het punt van de toepassing.