sql >> Databáze >  >> RDS >> Sqlserver

Dynamický návrh tabulky (společná vyhledávací tabulka), k získání hodnot potřebujete pěkný dotaz

Na začátku máme toto -- což je docela chaotické.

Abych to trochu očistil, přidávám dva pohledy a synonymum:

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

A nyní model vypadá takto

Nyní je jednodušší napsat dotaz

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

V tomto dotazu je zřejmý vzor, ​​takže jej lze vytvořit jako dynamický sql, pokud musíte přidat další tabulku typu modulu. Při přidávání další tabulky použijte ID a Title abyste nemuseli používat zobrazení.

UPRAVIT

Chcete-li vytvořit dynamické SQL (nebo dotaz na úrovni aplikace)

Upravte řádky 6 a 7, x-index je tb_modules.id

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

Přidejte řádky do levého spojení (pod řádkem 11)

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

SomeName je tb_modules.description a x-index odpovídá tb_modules.id

ÚPRAVA 2

Nejjednodušší by pravděpodobně bylo zabalit výše uvedený dotaz do pohledu a pak pokaždé, když se schéma změní, dynamicky vytvořit a spustit ALTER VIEW . Tímto způsobem by se dotaz z pohledu aplikace nezměnil.



  1. SQL dotaz s připojením a seskupením podle a

  2. ImportError:Žádný modul s názvem mysql.connector nepoužívá Python3?

  3. Test na nulovou funkci s různými parametry

  4. Použití utf8mb4 s php a mysql