最初はこれがありますが、これは非常に面倒です。

少しクリーンアップするために、2 つのビューとシノニムを追加します。
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
そして今、モデルは次のようになります

クエリの記述が簡単になりました
;
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) ;
このクエリには明らかなパターンがあるため、別のモジュール タイプのテーブルを追加する必要がある場合は、動的 SQL として作成できます。別のテーブルを追加するときは、ID
とTitle
を使用して、ビューを使用する必要がないようにします。
編集
動的 SQL (またはアプリケーション レベルでのクエリ) を構築するには
6 行目と 7 行目を変更すると、x-index は次のようになります。tb_modules.id
coalesce(x1. , x2. , x3. ..)
左の結合に行を追加します (行 11 の下)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
SomeName
istb_modules.description
と x-index が一致しているtb_modules.id
編集2
おそらく最も簡単なのは、上記のクエリをビューにパッケージ化し、スキーマが動的に変更されるたびにクレートして実行することALTER VIEW
です。このようにして、クエリはアプリケーションの時点から変更されません。