Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dynamiczny projekt tabeli (wspólna tabela przeglądowa), potrzebujesz ładnego zapytania, aby uzyskać wartości

Na początku mamy to -- co jest dość niechlujne.

Aby trochę uporządkować, dodaję dwa widoki i synonim:

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 teraz model wygląda tak

Łatwiej jest teraz napisać zapytanie

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

W tym zapytaniu istnieje oczywisty wzorzec, więc można je utworzyć jako dynamiczny sql, jeśli musisz dodać kolejną tabelę typu modułowego. Dodając kolejną tabelę, użyj ID i Title aby uniknąć konieczności korzystania z widoku.

EDYTUJ

Aby zbudować dynamiczny sql (lub zapytanie na poziomie aplikacji)

Zmodyfikuj linie 6 i 7, indeks x to tb_modules.id

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

Dodaj linie do lewego połączenia (poniżej linii 11)

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

SomeName to tb_modules.description a x-index pasuje do tb_modules.id

EDYTUJ 2

Najprostszym byłoby prawdopodobnie spakowanie powyższego zapytania do widoku, a następnie za każdym razem, gdy schemat zmienia się dynamicznie, twórz i uruchamiaj ALTER VIEW . W ten sposób zapytanie nie zmieni się z punktu aplikacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak niejawne transakcje działają w SQL Server

  2. Pojedyncze zapytanie sql, które może obsłużyć zarówno zakres dat zerowy, jak i wartościowy na serwerze sql

  3. Zrozumienie funkcji PIVOT w T-SQL

  4. Problem zaokrąglania w funkcjach LOG i EXP

  5. Jak zmusić bazę danych SQL Server 2008 do przejścia w tryb offline