2010-08-10 12 views
13

मेरे पास एक एसक्यूएल डीबी है जिसमें एकाधिक रिलेशनल टेबल हैं। मास्टर टेबल में कुछ फ़ील्ड हैं जो कई बार एक और तालिका का संदर्भ देते हैं। उदाहरण के लिए, कहें कि मेरे पास सेल्समैन का डेटाबेस है जो कई राज्यों के लिए बिक्री के लिए ज़िम्मेदार है। मेरे डेटाबेस में राज्य 1, राज्य 2 और राज्य 3 के लिए फ़ील्ड हैं, जिनमें से सभी राज्य तालिका में वापस मानचित्र हैं। मैं अपने जीवन के लिए पता नहीं लगा सकता कि सभी गणित राज्यों के साथ एक रिकॉर्ड वापस करने के लिए एक प्रश्न कैसे लिखना है। मैं केवल एक राज्य क्षेत्र की जरूरत है, तो मैं जानता हूँ कि मुझे क्या करना होगा:एसक्यूएल एकल तालिका के एकाधिक संदर्भों के साथ चयन करें

SELECT Master.Name, State.Enumeration AS 'State' 
FROM MasterTable Master, StateTable State 
WHERE Master.State1 = State.ID; 

कैसे मैं अपने सभी राज्य क्षेत्रों के लिए इस विस्तार कर सकते हैं?

धन्यवाद।

उत्तर

11

अद्वितीय में से प्रत्येक से एक कॉलम रिटर्निंग राज्यों को मिलती है:

select m.Name, s1.Enumeration as State1, s2.Enumeration as State2, s3.Enumeration as State3 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

3 से सभी राज्यों के 1 स्तंभ रिटर्निंग मिलती है:

select m.Name, ISNULL(s1.Enumeration + ',','') 
       + ISNULL(s2.Enumeration + ',','') 
       + ISNULL(s3.Enumeration,'') as Enumeration 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

वहाँ भी है और स्तम्भ के प्रश्नों। ..

select m.Name, 
ISNULL((select Enumeration from StateTable where ID = m.State1),'') as State1, 
ISNULL((select Enumeration from StateTable where ID = m.State2),'') as State2, 
ISNULL((select Enumeration from StateTable where ID = m.State3),'') as State3 
from MasterTable m 
+0

+1: बाएं जॉइन विकल्प जोड़ने के लिए –

+0

@ lumberjack4: आपके द्वारा पोस्ट किए गए ANSI-89 वाक्यविन्यास के बीच प्रदर्शन में कोई अंतर नहीं है, और फॉस्को का एएनएसआई-9 2। एएनएसआई-9 2 का लाभ मानकीकृत और व्यापक रूप से समर्थित बाहरी जॉइन (बाएं, दाएं कम से कम) वाक्यविन्यास है। –

+1

आप दोनों को धन्यवाद .. जब मैं दूसरी क्वेरी जोड़ने के लिए संपादन कर रहा था तो उसे एहसास हुआ। – Fosco

6

आपको इसकी कई प्रतियों में शामिल होने के लिए टेबल उपनाम का उपयोग करने की आवश्यकता है तालिका:

SELECT m.Name, 
      s1.Enumeration AS 'State1', 
      s2.Enumeration AS 'State2' 
    FROM MasterTable m 
LEFT JOIN StateTable s1 = s1.id = m.state1 
LEFT JOIN StateTable s2 = s1.id = m.state2 

एक INNER जॉइन के लिए आवश्यक है कि डेटा मौजूद है - यदि नहीं, तो संपूर्ण रिकॉर्ड को बाहर रखा गया है। एक बाएं जॉइन सुरक्षित है, जैसे कि राज्य 1/2/3/आदि NULLs की अनुमति देता है ...

+0

मैं एक स्पष्ट शामिल होने से बचने की उम्मीद कर रहा था, लेकिन ऐसा लगता है कि यह वही होना चाहिए। – lumberjack4

+0

@ lumberjack4 क्यों? – JNK

+0

मैं समझता हूं कि मेरी मूल क्वेरी दृश्यों के पीछे एक जुड़ती है, मुझे लगता है कि मैं यह जानने के लिए डेटाबेस के साथ पर्याप्त आरामदायक नहीं हूं कि इसमें शामिल होने का उपयोग कब किया जाए। – lumberjack4

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