2009-05-27 16 views
67

मुझे लगता है कि मैं इस एक के साथ सही रास्ते नीचे जा रहा हूँ ... मेरे साथ सहन कृपया के रूप में मेरी एसक्यूएल सबसे बड़ीचुनें * जहां मौजूद नहीं

मैं चयन करने के लिए एक डेटाबेस क्वेरी करने के लिए कोशिश कर रहा हूँ नहीं है एक टेबल से सब कुछ जहां कुछ कोशिकाएं दूसरे में मौजूद नहीं होती हैं। खास मतलब का एक बहुत नहीं है लेकिन मैं कोड होगा

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn) 

के इस टुकड़े आशा करती हूं कि तो बुनियादी तौर पर मैं कर्मचारियों और उनके विवरण की एक सूची के साथ एक मेज है। फिर उनके नाम सहित कुछ अन्य विवरणों के साथ एक और तालिका। जहां eotm_dyn तालिका में नाम नहीं है, जिसका अर्थ है कि उनके लिए कोई प्रविष्टि नहीं है, मैं देखना चाहता हूं कि वे वास्तव में कौन हैं, या दूसरे शब्दों में, देखें कि वास्तव में क्या गुम है।

उपरोक्त क्वेरी कुछ भी नहीं लौटाती है, लेकिन मुझे पता है कि 20ish नाम गायब हैं इसलिए मुझे स्पष्ट रूप से यह सही नहीं मिला है।

क्या कोई मदद कर सकता है?

उत्तर

105

आप अपनी क्वेरी में तालिका में शामिल नहीं किया था।

आपकी मूल क्वेरी हमेशा कुछ भी वापस नहीं आती है जब तक कि eotm_dyn में कोई रिकॉर्ड नहीं है, इस स्थिति में यह सब कुछ वापस कर देगा।

इन तालिकाओं मान लिया जाये कि employeeID पर शामिल हो गए जाना चाहिए, का उपयोग करें:

SELECT * 
FROM employees e 
WHERE NOT EXISTS 
     (
     SELECT null 
     FROM eotm_dyn d 
     WHERE d.employeeID = e.id 
     ) 

आप एक LEFT JOIN कीवर्ड के साथ इन तालिकाओं में शामिल होने और उन्हें फ़िल्टर कर NULL के कर सकते हैं, लेकिन इस संभावना का उपयोग कर की तुलना में कम कुशल हो जाएगा NOT EXISTS

+21

मुझे साल में दो बार "EXISTES नहीं" की आवश्यकता है, और मैं हमेशा भूल जाता हूं कि इसका उपयोग कैसे किया जाए। धन्यवाद - यह उदाहरण अब बुकमार्क किया जाएगा। – Mateng

+1

क्या कोई व्यक्ति कृपया "बाएं जॉइन + नूल फ़िल्टर" के लिए संदर्भ नहीं दे सकता है? यह स्पष्ट हो सकता है, लेकिन मैंने दस्तावेज़ों में कभी नहीं देखा। धन्यवाद। – toni07

+1

@ toni07 असल में, यह एक किंवदंती है। बाएं जॉइन जीतता है।https://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left- join-is-null-mysql/ .. Quassnoi का ब्लॉग हमेशा एक उपयोगी संसाधन है। – Kaii

11

आप एक बाएं जॉइन कर सकते हैं और शामिल कॉलम पूर्ण है।

उदाहरण:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL 
68
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn) 

या

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name) 

या

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL 
+0

एनबी की तरह! 'नहीं' 'अपेक्षित रूप से काम नहीं करता है अगर 'नाम' शून्य 'null'values। वीडियो में 36min 20sec से देखें [सत्र: 10 क्वेरी ट्यूनिंग तकनीक प्रत्येक SQL प्रोग्रामर को पता होना चाहिए (केविन क्लाइन, हारून बर्ट्रैंड)] (https://www.youtube.com/watch?v=XUCxQkFoqpw)। – hlovdal

6
SELECT * from employees 
WHERE NOT EXISTS (SELECT name FROM eotm_dyn) 

कभी किसी रिकॉर्ड जब तक रिटर्न eotm_dyn खाली है। आप यह सोचते हैं कि दो तालिकाओं एक विदेशी कुंजी रिश्ते से जुड़े हुए हैं जैसे

SELECT * from employees 
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid 
) 

SELECT name FROM eotm_dyn पर मापदंड किसी तरह की जरूरत है। इस बिंदु पर आप बाएं जॉइन सहित कई अन्य विकल्पों का उपयोग कर सकते हैं। हालांकि, अधिकांश मामलों में ऑप्टिमाइज़र आमतौर पर उन्हें समान रूप से संभाल लेगा।

4

आप this related question पर भी एक नज़र डाल सकते हैं। उस उपयोगकर्ता ने बताया कि एक उप-क्वेरी का उपयोग करने से बेहतर प्रदर्शन प्रदान करने के लिए।

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