No início temos isso -- que é bastante confuso.
Para limpar um pouco, adiciono duas visualizações e um 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
E agora o modelo parece
Agora é mais fácil escrever a 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) ;
Há um padrão óbvio nessa consulta, portanto, ela pode ser criada como sql dinâmico se você precisar adicionar outra tabela do tipo módulo. Ao adicionar outra tabela, use
ID
e Title
para evitar ter que usar uma visão. EDITAR
Para construir sql dinâmico (ou consulta no nível do aplicativo)
Modifique as linhas 6 e 7, o x-index é
tb_modules.id
coalesce(x1. , x2. , x3. ..)
Adicione linhas à junção esquerda (abaixo da linha 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
O
SomeName
é tb_modules.description
e x-index está correspondendo a tb_modules.id
EDITAR 2
O mais simples provavelmente seria empacotar a consulta acima em uma visão e, em seguida, cada vez que o esquema mudar dinamicamente, encrave e execute
ALTER VIEW
. Dessa forma, a consulta não mudaria do ponto do aplicativo.