В началото имаме това -- което е доста объркано.
За да изчистя малко, добавям два изгледа и синоним:
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-индексът е tb_modules.id
coalesce(x1. , x2. , x3. ..)
Добавете линии към лявото съединение (под ред 11)
left join v_SomeName as x3 on m.TableName = 'tb_SomeName'
SomeName
е tb_modules.description
и x-index съответства на tb_modules.id
РЕДАКТИРАНЕ 2
Най-простият вероятно би бил да опаковате горната заявка в изглед и след това всеки път, когато схемата се промени динамично да създадете и изпълните ALTER VIEW
. По този начин заявката няма да се промени от точката на приложението.