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

Dynamisk tabeldesign (fælles opslagstabel), har brug for en god forespørgsel for at få værdierne

I begyndelsen har vi dette -- som er ret rodet.

For at rydde lidt op tilføjer jeg to visninger og et synonym:

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

Og nu ser modellen sådan ud

Det er nemmere nu at skrive forespørgslen

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

Der er et åbenlyst mønster i denne forespørgsel, så den kan oprettes som dynamisk sql, hvis du skal tilføje en anden modul-type tabel. Når du tilføjer en anden tabel, skal du bruge ID og Title for at undgå at skulle bruge en udsigt.

REDIGER

At bygge dynamisk sql (eller forespørgsel på applikationsniveau)

Rediger linje 6 og 7, x-indekset er tb_modules.id

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

Tilføj linjer til venstre sammenføjning (under linje 11)

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

SomeName er tb_modules.description og x-index matcher tb_modules.id

REDIGERING 2

Det enkleste ville sandsynligvis være at pakke ovenstående forespørgsel ind i en visning og derefter hver gang skemaet ændres dynamisk kasse og køre ALTER VIEW . På denne måde ville forespørgslen ikke ændre sig fra applikationens punkt.



  1. PLS-00103 Opstod symbol> fejl under udførelse af lagret procedure

  2. Paging valg, på database eller i webapplikationen

  3. Forkert vejledningsrækkefølge

  4. SQL Server - Skal tilmeldes, men hvor IKKE lig med