शुरुआत में हमारे पास यह है -- जो काफी गड़बड़ है।
थोड़ा सा साफ करने के लिए मैं दो विचार और एक समानार्थी जोड़ता हूं:
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
चलाता है . इस तरह आवेदन के स्थान से क्वेरी नहीं बदलेगी।