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.