All'inizio abbiamo questo -- che è piuttosto disordinato.
Per ripulire un po' aggiungo due viste e un sinonimo:
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
E ora il modello assomiglia a
Ora è più facile scrivere la query
;
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'è un modello ovvio in questa query, quindi può essere creato come sql dinamico se devi aggiungere un'altra tabella di tipo modulo. Quando aggiungi un'altra tabella, usa ID
e Title
per evitare di dover utilizzare una vista.
MODIFICA
Per creare sql dinamico (o query a livello di applicazione)
Modifica le righe 6 e 7, l'indice x è tb_modules.id
coalesce(x1. , x2. , x3. ..)
Aggiungi linee al join sinistro (sotto la linea 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
Il SomeName
è tb_modules.description
e x-index corrisponde a tb_modules.id
MODIFICA 2
Il più semplice sarebbe probabilmente quello di impacchettare la query precedente in una vista e quindi ogni volta che lo schema cambia in modo dinamico, creare ed eseguire ALTER VIEW
. In questo modo la query non cambierebbe dal punto dell'applicazione.