sql >> Base de Datos >  >> RDS >> Sqlserver

Diseño de tabla dinámica (tabla de búsqueda común), necesita una buena consulta para obtener los valores

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.