sql >> Database >  >> RDS >> Sqlserver

Dynamisch tabelontwerp (algemene opzoektabel), heeft een mooie query nodig om de waarden te krijgen

In het begin hebben we dit -- wat nogal rommelig is.

Om een ​​beetje op te ruimen, voeg ik twee views en een synoniem toe:

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

En nu ziet het model eruit als

Het is nu gemakkelijker om de vraag te schrijven

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

Er is een duidelijk patroon in deze query, dus het kan worden gemaakt als dynamische sql als u nog een tabel van het moduletype moet toevoegen. Gebruik bij het toevoegen van een andere tabel ID en Title om te voorkomen dat u een weergave moet gebruiken.

BEWERKEN

Dynamische sql bouwen (of query op applicatieniveau)

Pas regels 6 en 7 aan, de x-index is tb_modules.id

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

Voeg regels toe aan de linker join (onder regel 11)

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

De SomeName is tb_modules.description en x-index komt overeen met tb_modules.id

BEWERK 2

De eenvoudigste zou waarschijnlijk zijn om de bovenstaande query in een weergave te verpakken en vervolgens elke keer dat het schema dynamisch verandert, te kratten en ALTER VIEW uit te voeren. . Op deze manier zou de vraag niet veranderen vanaf het punt van de toepassing.



  1. PostgreSQL kolommen naar rijen converteren? transponeren?

  2. Fatale fout:aanroep naar niet-gedefinieerde functie getsqlvaluestring()

  3. Rails met Postgres-gegevens worden buiten gebruik geretourneerd

  4. Om een ​​SSIS-pakket buiten SQL Server Data Tools uit te voeren, moet u Move File to Archive of Integration Services of hoger installeren