Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conception de table dynamique (table de recherche commune), besoin d'une belle requête pour obtenir les valeurs

Au début, nous avons ceci - qui est assez désordonné.

Pour nettoyer un peu, j'ajoute deux vues et un synonyme :

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

Et maintenant, le modèle ressemble

Il est maintenant plus facile d'écrire la requête

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

Il existe un modèle évident dans cette requête, elle peut donc être créée en tant que sql dynamique si vous devez ajouter une autre table de type module. Lors de l'ajout d'une autre table, utilisez ID et Title pour éviter d'avoir à utiliser une vue.

MODIFIER

Pour construire SQL dynamique (ou requête au niveau de l'application)

Modifiez les lignes 6 et 7, le x-index est tb_modules.id

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

Ajouter des lignes à la jointure gauche (sous la ligne 11)

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

Le SomeName est tb_modules.description et x-index correspond à tb_modules.id

MODIFICATION 2

Le plus simple serait probablement de regrouper la requête ci-dessus dans une vue, puis chaque fois que le schéma change dynamiquement, créez et exécutez ALTER VIEW . De cette façon, la requête ne changerait pas du point de vue de l'application.