Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Il design dinamico della tabella (tabella di ricerca comune), necessita di una bella query per ottenere i valori

All'inizio abbiamo questo -- che è piuttosto disordinato.

Per ripulire un po' aggiungo due viste e un sinonimo:

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 ora il modello assomiglia a

Ora è più facile scrivere la query

;
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) ;

C'è un modello ovvio in questa query, quindi può essere creato come sql dinamico se devi aggiungere un'altra tabella di tipo modulo. Quando aggiungi un'altra tabella, usa ID e Title per evitare di dover utilizzare una vista.

MODIFICA

Per creare sql dinamico (o query a livello di applicazione)

Modifica le righe 6 e 7, l'indice x è tb_modules.id

coalesce(x1. , x2. , x3. ..) 

Aggiungi linee al join sinistro (sotto la linea 11)

left join v_SomeName as x3  on m.TableName = 'tb_SomeName'

Il SomeName è tb_modules.description e x-index corrisponde a tb_modules.id

MODIFICA 2

Il più semplice sarebbe probabilmente quello di impacchettare la query precedente in una vista e quindi ogni volta che lo schema cambia in modo dinamico, creare ed eseguire ALTER VIEW . In questo modo la query non cambierebbe dal punto dell'applicazione.