2009-04-20 20 views
5

मैं एक ऐसा दृश्य बनाना चाहता हूं जो दो तालिकाओं "अनुसूची" और "संदर्भ" से डेटा खींचता है।किसी तालिका में एक कॉलम में एकाधिक कॉलम में किसी अन्य तालिका में एक कॉलम में शामिल होना

अनुसूची में 50+ कॉलम हैं (यह लगभग पूरी तरह से denormalized है - मेरा डिजाइन नहीं), जिनमें से अधिकतर एक मान है जो संदर्भ तालिका में एक कॉलम में शामिल हो सकता है।

संदर्भ में एकल कॉलम में अनुसूची में प्रत्येक कॉलम में सही ढंग से शामिल होने के लिए मैं SQL कथन कैसे लिखूं?

अनुसूची तालिका के रूप में परिभाषित किया गया है:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] NOT NULL, 
    [SCHEDULEWEEK] [datetime] NOT NULL, 
    [EMPNO] [numeric](10, 0) NOT NULL, 
    [EMPLNAME] [varchar](32) NULL, 
    [EMPFNAME] [varchar](32) NULL, 
    [EMPSENDATE] [datetime] NULL, 
    [EMPHIREDATE] [datetime] NULL, 
    [EMPTYPE] [char](1) NULL, 
    [EMPSTATUS] [char](1) NULL, 
    [SNREFUSALS] [tinyint] NULL, 
    [QUALSTRING] [varchar](128) NULL, 
    [JOBOVERSHIFTTYPE] [bit] NULL, 
    [SHORTNOTICE] [bit] NULL, 
    [SHORTNOTICEWAP] [bit] NULL, 
    [SHORTNOTICEPHONE] [varchar](32) NULL, 
    [LEADHAND] [bit] NULL, 
    [DUALCURRENCY] [bit] NULL, 
    [MIN100WINDOW] [bit] NULL, 
    [STATHOLIDAY] [bit] NULL, 
    [AREAOVERHOURS] [bit] NULL, 
    [DOUBLEINTERZONES] [bit] NULL, 
    [MAXDAYSPERWEEK] [tinyint] NULL, 
    [MAXHOURSPERWEEK] [numeric](10, 2) NULL, 
    [MAXHOURSPERSHIFT] [numeric](10, 2) NULL, 
    [MAXDOUBLESPERWEEK] [tinyint] NULL, 
    [ASSIGNEDDAYS] [tinyint] NULL, 
    [ASSIGNEDHOURS] [numeric](10, 2) NULL, 
    [ASSIGNEDDOUBLES] [tinyint] NULL, 
    [ASSIGNEDLOAHOURS] [numeric](10, 2) NULL, 
    [SHIFTNO1] [int] NULL, 
    [TEXT1_1] [varchar](64) NULL, 
    [TEXT2_1] [varchar](64) NULL, 
    [DAYFLAG1] [bit] NULL, 
    [COMMENT1] [text] NULL, 
    [SHIFTNO2] [int] NULL, 
    [TEXT1_2] [varchar](64) NULL, 
    [TEXT2_2] [varchar](64) NULL, 
    [DAYFLAG2] [bit] NULL, 
    [COMMENT2] [text] NULL, 
    [SHIFTNO3] [int] NULL, 
    [TEXT1_3] [varchar](64) NULL, 
    [TEXT2_3] [varchar](64) NULL, 
    [DAYFLAG3] [bit] NULL, 
    [COMMENT3] [text] NULL, 
    [SHIFTNO4] [int] NULL, 
    [TEXT1_4] [varchar](64) NULL, 
    [TEXT2_4] [varchar](64) NULL, 
    [DAYFLAG4] [bit] NULL, 
    [COMMENT4] [text] NULL, 
    [SHIFTNO5] [int] NULL, 
    [TEXT1_5] [varchar](64) NULL, 
    [TEXT2_5] [varchar](64) NULL, 
    [DAYFLAG5] [bit] NULL, 
    [COMMENT5] [text] NULL, 
    [SHIFTNO6] [int] NULL, 
    [TEXT1_6] [varchar](64) NULL, 
    [TEXT2_6] [varchar](64) NULL, 
    [DAYFLAG6] [bit] NULL, 
    [COMMENT6] [text] NULL 
-- Snip 
) ON [PRIMARY] 

और संदर्भ तालिका के रूप में परिभाषित किया गया है:

CREATE TABLE [dbo].[Reference](
    [ID] [int] NOT NULL, 
    [CODE] [varchar](21) NOT NULL, 
    [LOCATIONCODE] [varchar](4) NOT NULL, 
    [SCHAREACODE] [varchar](16) NOT NULL, 
    [LOCATIONNAME] [varchar](32) NOT NULL, 
    [FLTAREACODE] [varchar](16) NOT NULL 
) ON [PRIMARY] 

मैं में प्रत्येक [TEXT1_ ]/[TEXT2_] स्तंभ शामिल होने के लिए कोशिश कर रहा हूँ संदर्भ में [SCHAREACODE] कॉलम की अनुसूची। सभी संदर्भ तालिका में उन क्षेत्रों की एक सूची है जहां कर्मचारी काम कर सकता है।

+0

कृपया अपने प्रश्नों के उदाहरण के साथ अपना प्रश्न अपडेट करें और आप जिस आरडीबीएमएस का उपयोग कर रहे हैं - उदा। MySQL, SQL सर्वर, आदि – Seb

+0

क्या अनुसूची में प्रत्येक कॉलम संदर्भ में COLUMN में शामिल होता है - या क्या आप वास्तव में एक पंक्ति का मतलब है? कृपया एक उदाहरण प्रदान करें (उदाहरण के लिए 50 कॉलम में से 3।) –

+0

क्या एक अल्पविराम सीमित सूची या केवल एक क्षेत्र कोड है? –

उत्तर

0

अद्यतन प्रश्न से

शायद ऐसा कुछ? इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं।

SELECT S.ID 
    S.TEXT1_1, 
    TEXT1_1_RID = COALESCE((SELECT MAX(R.ID) FROM Reference R WHERE R.SCHAREACODE = S.TEXT1_1), 0), 
    S.TEXT1_2, 
    TEXT1_2_RID = COALESCE((SELECT MAX(R.ID) FROM Reference R WHERE R.SCHAREACODE = S.TEXT1_2), 0), 
    ... 
FROM Schedule S 
+0

मुझे संदेह है कि यह एकमात्र तरीका हो सकता है। –

6

मुझे लगता है कि वह संदर्भ तालिका पर कई बार शामिल होने के लिए इसका मतलब है:

SELECT * 
    FROM Schedule AS S 
INNER JOIN Reference AS R1 
     ON R1.ID = S.FirstID 
INNER JOIN Reference AS R2 
     ON R2.ID = S.SecondID 
INNER JOIN Reference AS R3 
     ON R3.ID = S.ThirdID 
INNER JOIN Reference AS R4 
     ON R4.ID = S.ForthID 
+0

क्या होगा यदि मैं संदर्भ तालिका से कुछ कॉलम चुनना चाहता हूं? क्या यह "R1.ID, R2.ID, R3.ID, R4.ID चुनें ......." – nakul

1

आपका वर्णन थोड़ा कमी है, इसलिए मुझे लगता है कि

अनुसूची है ग्रहण करने के लिए जा रहा हूँ 50+ कॉलम (यह लगभग पूरी तरह से denormalized है - मेरे डिजाइन नहीं), जिनमें से अधिकतर एक मान है जो संदर्भ तालिका में एक कॉलम में शामिल हो सकता है।

का अर्थ है कि अनुसूची में 50+ कॉलम में से एक संदर्भ आईडी है।

Schedule (MaybeReferenceId1, MaybeReferenceId2, MaybeReferenceId3, ...) 
Reference (ReferenceId) 

कुछ की तरह:

SELECT * 
FROM Schedule 
JOIN Reference ON 
    Schedule.MaybeReferenceId1 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId2 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId3 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId4 = Reference.ReferenceId 
    ... 

काम करेगा तो, की तरह एक तालिका डिजाइन दिया। अपने आरडीबीएमएस यह समर्थन करता है तो आप IN का उपयोग करके इसे आसान बनाने में कर सकते हैं:

SELECT * 
FROM Schedule 
JOIN Reference ON 
    Reference.ReferenceId IN (
     Schedule.MaybeReferenceId1, 
     Schedule.MaybeReferenceId2, 
     Schedule.MaybeReferenceId3, 
     Schedule.MaybeReferenceId4, 
     ... 
    ) 
0

TheSoftwareJedi के साथ सहमत हैं, लेकिन मैं सिर्फ इतना है कि विफलताओं करने वाली मैच गायब करने के लिए अपने अनुसूची पंक्ति का कारण नहीं है वाम मिलती उपयोग करने का सुझाव कर सकते हैं ?

बेशक, 28 जॉइन करने से विवरण कुछ भी बोझिल होने वाला है।

मुझे यकीन है कि मैं फोन करता हूँ इस "denormalized", और "abnormalized" नहीं कर रहा हूँ ... :-)

+0

मुझे लगता है कि यह निर्भर करता है: यदि आपका डीबी को पता चलता है कि आप एक ही टेबल के खिलाफ शामिल हो रहे हैं, तो यह महसूस हो सकता है कि उस तालिका को इन-मेमोरी हैश में स्लिपिंग करना एक उचित योजना है। स्कीमा सुंदर नहीं है, लेकिन मैंने और भी खराब देखा है। – araqnid

0

इस तरह एक प्रश्न का प्रयास करें:

select s.*, r.schareacode from schedule s, 
where 
s.text1_1 = s.schareacode 
or s.text2_1 = s.schareacode 
or s.textx_x = s.schareacode 
.. 

आप करने में सक्षम होना चाहिए परंपरागत जुड़ने के साथ एक ही परिणाम प्राप्त करें, इसलिए मैं आपको इसके साथ प्रयोग करने की सलाह देता हूं।

संबंधित मुद्दे