2010-10-29 11 views
5

मैं एक प्रशिक्षण ट्रैकर प्रोग्राम पर काम कर रहा हूं और मैं उस बिंदु पर हूं जहां मैं SQL क्वेरी नहीं समझ सकता।एसक्यूएल क्वेरी: सभी तालिकाओं को एक तालिका में सूचीबद्ध करें जो किसी अन्य तालिका में दिखाई नहीं दे रहा है

मेरे पास 3 टेबल हैं: employees, trainingRecords, masterList

employees और trainingRecordsempID फ़की से संबंधित हैं।

trainingRecords और masterListTID फ़की से संबंधित हैं।

अभी प्रशिक्षण प्रशिक्षण तालिका खाली है क्योंकि कुछ भी दर्ज नहीं किया गया है (सभी कर्मचारियों के पास कोई प्रशिक्षण नहीं है)।

मैं मास्टरलिस्ट में सभी आइटमों के साथ एक सूची बॉक्स को पॉप्युलेट करना चाहता हूं जो trainingRecords तालिका में अनचाहे हैं।

के बाद से trainingRecords तालिका खाली है, यह मास्टर सूची में सभी प्रविष्टियों के लिए employees मेज से lName, fName और docName, docNumber लौट जाना चाहिए।

मैं स्टंप हो गया हूं। कोई सुझाव?

उत्तर

5

मुझे लगता है कि आप उन सभी प्रशिक्षण दस्तावेजों के साथ कई बार प्रदर्शित करना चाहते हैं जो उन्होंने अभी तक नहीं किए हैं।

SELECT a.lName, a.fName, b.docNumber, b.docName 
FROM 
(SELECT e.lName, e.fName, t.TID 
FROM employees e 
LEFT JOIN trainingRecords t ON e.empID = t.empID 
) AS a, 
(SELECT m.docNumber, m.docName, t.TID 
FROM masterList m 
LEFT JOIN trainingRecords t ON m.TID = t.TID 
) AS b 
WHERE a.TID IS NULL OR b.TID IS NULL 
ORDER BY a.lName, b.docNumber 

उदाहरण परिणाम:

lName  fName docNumber   docName 
Simpson Homer  1  Nuclear Physics for Dummies 
Simpson Homer  2  Nuclear Physics for Beginners 
Simpson Homer  3  Advanced Nuclear Physics 
Simpson Lisa  3  Advanced Nuclear Physics 
+0

यह पहले काम करता था, लेकिन फिर मैंने एक रिकॉर्ड जोड़ा और अब इसकी रिक्त खाली तालिका – Sinaesthetic

+0

ने जहां खंड को बदल दिया और भाग बी में एक और कॉलम जोड़ा। यह अब ठीक से काम करना चाहिए :) – JumpingJezza

+0

बोयाया वहाँ है। मैं स्मृति से इसे फिर से बनाने के लिए इसे अलग करने में भी सक्षम था, धन्यवाद। – Sinaesthetic

3

आप बाएं जॉइन चाहते हैं, जुड़ने के बाईं ओर, वह तालिका होगी जो आपको पता चलेगी कि सबकुछ इसमें होगा और दाईं ओर आप परीक्षण करेंगे।

select masterList.* from masterList LEFT JOIN trainingRecords ON(masterList.TID = trainingRecords.TID) WHERE trainingRecords.TID IS NULL; 
+0

मैंने इसे बहुत अधिक समझने का अंत किया, लेकिन मैं वहां कर्मचारी का नाम कैसे प्राप्त करूं? – Sinaesthetic

0

ठीक है, तुम क्योंकि यह अन्य दो तालिकाओं से जोड़ने के लिए आवश्यक स्तंभ होते हैं बीच में trainingRecords तालिका के साथ सभी तीन टेबल शामिल होना पड़ेगा। आपकी क्वेरी इस तरह कुछ दिखाई देगी:

SELECT E.lName, E.fName, ML.docName, ML.docNumber FROM 
    (employees E LEFT OUTER JOIN trainingRecords TR ON E.empID = TR.empID) 
       RIGHT OUTER JOIN masterList ML ON ML.TID = TR.TID 
    WHERE TR.TID IS NULL 

यहां क्या हो रहा है?

सबसे पहले, आप कर्मचारियों और प्रशिक्षण रिकॉर्डर्स के बाएं बाहरी जॉइन कर रहे हैं। बाएं आउटर यह सुनिश्चित करना है कि कर्मचारियों के सभी रिकॉर्ड तब भी दिखाई दें जब प्रशिक्षण में कोई मिलान नहीं होता है (जो निश्चित रूप से प्रशिक्षण के बाद मौजूद नहीं हैं रिकॉर्डर्स के पास कोई डेटा नहीं है)।

फिर, आप उस क्वेरी के परिणाम ले रहे हैं और दाएं आउटर उन्हें मास्टरलिस्ट में शामिल कर रहे हैं। सही आउटर गारंटी देता है कि प्रशिक्षण मास्टर में कोई मिलान नहीं होने पर भी सभी मास्टरलिस्ट रिकॉर्ड शामिल किए जाएंगे।

अंत में, जहां TR.TID किसी भी रिकॉर्ड को नल फ़िल्टर करता है जो वास्तव में प्रशिक्षण रिकॉर्डर्स में किसी भी (भविष्य) रिकॉर्ड से मेल खाता है।

+0

यह सुनिश्चित नहीं है कि क्या हुआ लेकिन मुझे एक त्रुटि मिली जिसमें कहा गया था कि समर्थन समर्थित नहीं था। Aliasing? – Sinaesthetic

-1

क्यों नहीं पूर्ण शामिल हों का उपयोग करें? मैं जो उपयोग करता हूं वह है:

Select A.* from A Full Join B on A.ID = B.ID where B.ID is NULL 
+0

सिर्फ यह समझें कि पूर्ण मामले में इस मामले में बाएं शामिल होने के समान परिणाम हैं। –

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

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