Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamisches Tabellendesign (gemeinsame Nachschlagetabelle), benötigt eine nette Abfrage, um die Werte zu erhalten

Am Anfang haben wir das – was ziemlich chaotisch ist.

Um etwas aufzuräumen, füge ich zwei Ansichten und ein Synonym hinzu:

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

Und jetzt sieht das Modell so aus

Es ist jetzt einfacher, die Abfrage zu schreiben

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

Diese Abfrage weist ein offensichtliches Muster auf, sodass sie als dynamisches SQL erstellt werden kann, wenn Sie eine weitere Modultabelle hinzufügen müssen. Wenn Sie eine weitere Tabelle hinzufügen, verwenden Sie ID und Title um zu vermeiden, eine Ansicht verwenden zu müssen.

BEARBEITEN

Dynamisches SQL erstellen (oder Abfragen auf Anwendungsebene)

Ändern Sie die Zeilen 6 und 7, der x-Index ist tb_modules.id

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

Zeilen zum linken Join hinzufügen (unter Zeile 11)

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

Der SomeName ist tb_modules.description und x-index stimmt mit tb_modules.id überein

BEARBEITEN 2

Am einfachsten wäre es wahrscheinlich, die obige Abfrage in eine Ansicht zu packen und dann jedes Mal, wenn sich das Schema ändert, ALTER VIEW zu erstellen und auszuführen . Dadurch würde sich die Abfrage aus Sicht der Anwendung nicht ändern.