Au début, nous avons ceci - qui est assez désordonné.
Pour nettoyer un peu, j'ajoute deux vues et un synonyme :
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
Et maintenant, le modèle ressemble
Il est maintenant plus facile d'écrire la requête
;
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) ;
Il existe un modèle évident dans cette requête, elle peut donc être créée en tant que sql dynamique si vous devez ajouter une autre table de type module. Lors de l'ajout d'une autre table, utilisez ID
et Title
pour éviter d'avoir à utiliser une vue.
MODIFIER
Pour construire SQL dynamique (ou requête au niveau de l'application)
Modifiez les lignes 6 et 7, le x-index est tb_modules.id
coalesce(x1. , x2. , x3. ..)
Ajouter des lignes à la jointure gauche (sous la ligne 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
Le SomeName
est tb_modules.description
et x-index correspond à tb_modules.id
MODIFICATION 2
Le plus simple serait probablement de regrouper la requête ci-dessus dans une vue, puis chaque fois que le schéma change dynamiquement, créez et exécutez ALTER VIEW
. De cette façon, la requête ne changerait pas du point de vue de l'application.