sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk tabelldesign (vanlig uppslagstabell), behöver en trevlig fråga för att få värdena

I början har vi det här -- vilket är ganska rörigt.

För att rensa lite lägger jag till två vyer och en 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

Och nu ser modellen ut som

Det är lättare nu att skriva frågan

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

Det finns ett uppenbart mönster i den här frågan, så den kan skapas som dynamisk sql om du måste lägga till en annan tabell av modultyp. Använd ID när du lägger till ytterligare en tabell och Title för att slippa använda en vy.

REDIGERA

Att bygga dynamisk sql (eller fråga på applikationsnivå)

Ändra rad 6 och 7, x-indexet är tb_modules.id

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

Lägg till rader till vänster sammanfogning (under rad 11)

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

SomeName är tb_modules.description och x-index matchar tb_modules.id

REDIGERA 2

Det enklaste skulle förmodligen vara att paketera ovanstående fråga i en vy och sedan varje gång schemat ändras dynamiskt låda och köra ALTER VIEW . På så sätt ändras inte frågan från programmets punkt.



  1. Hur ställer jag in phpmyadmin och SQL för meddelandehantering via REST-api?

  2. funktionen UNIX_TIMESTAMP finns inte

  3. Behöver Oracle SQL för att dela upp datum/tidsintervall efter dag

  4. java.math.BigInteger kan inte castas till java.lang.Integer