Al principio tenemos esto, que es bastante complicado.
Para limpiar un poco, agrego dos vistas y un sinónimo:
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
Y ahora el modelo parece
Ahora es más fácil escribir la consulta
;
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) ;
Hay un patrón obvio en esta consulta, por lo que se puede crear como sql dinámico si tiene que agregar otra tabla de tipo módulo. Al agregar otra tabla, use ID
y Title
para evitar tener que usar una vista.
EDITAR
Para construir sql dinámico (o consulta a nivel de aplicación)
Modifique las líneas 6 y 7, el índice x es tb_modules.id
coalesce(x1. , x2. , x3. ..)
Agregue líneas a la unión izquierda (debajo de la línea 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
El SomeName
es tb_modules.description
y x-index coincide con tb_modules.id
EDITAR 2
Probablemente, lo más simple sería empaquetar la consulta anterior en una vista y luego, cada vez que el esquema cambia, crea y ejecuta dinámicamente ALTER VIEW
. De esta manera la consulta no cambiaría desde el punto de la aplicación.