चयन करें * कहां नहीं हैं


94

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

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

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

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

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

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

जवाबों:


160

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

आपकी मूल क्वेरी हमेशा कुछ भी नहीं लौटाएगी जब तक कि कोई रिकॉर्ड नहीं है 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


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

1
क्या कोई व्यक्ति कृपया "LEFT JOIN + NULL फ़िल्टर के लिए कम महत्वपूर्ण नहीं है" के लिए एक संदर्भ दे सकता है? यह स्पष्ट हो सकता है, लेकिन मैंने डॉक्स में ऐसा कभी नहीं देखा। धन्यवाद।
टोनि07

2
@ toni07 दरअसल, यह एक किंवदंती है। बाईं ओर जीतता है। explainextended.com/2009/09/18/… .. Quassnoi का ब्लॉग हमेशा एक उपयोगी संसाधन है।
काई

मैं एक HAVING खंड में इसका उपयोग कैसे करूंगा? उर्फgroup by X having exist [row with employeeID = e.id]
phil294

@ब्लौहिरन: ठीक उसी तरह
क्वासोइ जूल

83
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

1
नायब! NOT INकाम नहीं करता है के रूप में की उम्मीद करता है, तो nameहै nullमान। वीडियो में 36min 20 सेकेंड से देखें सत्र: 10 क्वेरी ट्यूनिंग तकनीक हर SQL प्रोग्रामर को पता होना चाहिए (केविन क्लाइन, आरोन बर्ट्रेंड)
हवलदार सेप

12

आप एक लेफ्टिनेंट जॉइन कर सकते हैं और ज्वाइन किए गए कॉलम को पूरा कर सकते हैं।

उदाहरण:

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

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

जब तक eotm_dynखाली न हो कोई भी रिकॉर्ड वापस नहीं करता है। आप पर मापदंड किसी तरह की जरूरत है SELECT name FROM eotm_dynकी तरह

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.