Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Design de tabela dinâmica (tabela de pesquisa comum), precisa de uma boa consulta para obter os valores


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.