एक तालिका से सभी रिकॉर्ड का चयन कैसे करें जो किसी अन्य तालिका में मौजूद नहीं है?


जवाबों:


843
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

प्रश्न : यहाँ क्या हो रहा है?

A : वैचारिक रूप से हम सभी पंक्तियों का चयन करते हैं table1और प्रत्येक पंक्ति के लिए हम स्तंभ के table2लिए समान मान के साथ एक पंक्ति खोजने का प्रयास करते हैं name। यदि ऐसी कोई पंक्ति नहीं है, तो हम table2अपने परिणाम के भाग को उस पंक्ति के लिए खाली छोड़ देते हैं । फिर हम केवल उन पंक्तियों को उठाकर अपने चयन में बाधा डालते हैं, जहां मिलान पंक्ति मौजूद नहीं है। अंत में, हम अपने परिणाम से सभी क्षेत्रों को अनदेखा कर देते हैं सिवाय nameकॉलम के (जिसे हम सुनिश्चित करते हैं कि मौजूद है, वहां से)table1 )।

हालांकि यह सभी मामलों में सबसे अधिक संभव तरीका नहीं हो सकता है, यह मूल रूप से हर डेटाबेस इंजन में काम करना चाहिए जो एएनएसआई एनसी एसक्यूएल को लागू करने का प्रयास करता है।


16
@ z- बॉस: यह SQL सर्वर पर सबसे कम प्रदर्शन करने वाला भी है: explainextended.com/2009/09/15/…
OMG Ponies

7
@ बंकरबॉय: एक बायीं ज्वाइन पंक्तियों को दायीं ओर मौजूद होने की अनुमति देता है, इसके बिना बायीं ओर पंक्तियों के शामिल होने को प्रभावित नहीं करता है। एक आंतरिक जुड़ाव में बाईं ओर पंक्तियों की आवश्यकता होती है और उपस्थित होने का अधिकार होता है। मैं यहाँ क्या कर रहा हूँ मूल रूप से एक आंतरिक जुड़ाव के रिवर्स चयन को प्राप्त करने के लिए कुछ तर्क लागू कर रहा हूँ।
क्रिस

2
omg ने बहुत आसानी से कल्पना करने में मदद की, दूसरों ने इसे 5 अलग-अलग तरीकों से रखा था लेकिन इससे मदद मिली। सरल: पहले आप बाएं से जुड़ते हैं, ए में सब कुछ है, और बी में सब कुछ है जो ए से मेल खाता है। लेकिन जैसा कि बाएं से जुड़ने वाले फ़ील्ड में होता है जो शामिल नहीं होता है वह सिर्फ सुस्त है। तो फिर तुम बताओ, ठीक है मैं केवल इतना है कि अशक्त हैं चाहते हैं। इस तरह अब आपके पास A में सभी पंक्तियाँ हैं जो
मुहम्मद उमर

7
यह ध्यान दिया जाना चाहिए कि यह समाधान (स्वीकार और मतदान) केवल एक ही है, मुझे लगता है, एक परिदृश्य के लिए संपादित किया जा सकता है जहां एक से अधिक क्षेत्र खेलने में आते हैं। विशेष रूप से, मैं तालिका एक से फ़ील्ड 2, फ़ील्ड 3, फ़ील्ड 3 वापस कर रहा हूं जहां फ़ील्ड विज्ञापन फ़ील्ड 2 का संयोजन दूसरी तालिका में नहीं है। इस उत्तर में शामिल होने को संशोधित करने के अलावा, मुझे नीचे दिए गए कुछ अन्य "अधिक कुशल जवाब" के साथ ऐसा करने का कोई तरीका नहीं दिखता है
TMWP

1
बस सुनिश्चित करें कि आप "WHERE t2.name IS NULL" का उपयोग करते हैं और न कि "AND t2.name IS NULL" क्योंकि "और" सही परिणाम नहीं देंगे। मुझे वास्तव में समझ में नहीं आया कि यह एक तथ्य क्यों है, मैंने इसका परीक्षण किया।
user890332

236

आप या तो कर सकते हैं

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

या

SELECT name 
FROM table2 
WHERE NOT EXISTS 
    (SELECT * 
     FROM table1 
     WHERE table1.name = table2.name)

इसे पूरा करने के लिए 3 तकनीकों के लिए यह प्रश्न देखें


38
यह बड़ी मात्रा में डेटा के साथ अविश्वसनीय रूप से धीमा है।
लाइटबल्ब

हाँ, वास्तव में यह बहुत धीमा है
वायरस

यह क्वेरी मौजूद नहीं है के उपश्रेणी में "तालिका 1 से" नहीं होना चाहिए।
हाउंड

बहुत उलझन में है कि यह कैसे इतने सारे अपवित्र हो गए। मुझे इसका उपयोग करने के लिए एक कारण के बारे में सोचना बहुत कठिन लगता है, जब इस समस्या के लिए एक दृष्टिकोण है जो किस्ट्रोक्स की लगभग समान संख्या के साथ अविश्वसनीय रूप से तेज़ है।
सर्चेंगाइन 27

इसने मेरे लिए काम किया .. थैंक यू
थैमेम

81

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

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT name 
     FROM table1)

क्या एफएआर व्यवहार में अधिक कुशल है। मुझे पता नहीं क्यों, लेकिन मैं इसे 800k + रिकॉर्ड के खिलाफ चला रहा हूं और अंतर 2 के ऊपर दिए गए उत्तर के लाभ के साथ जबरदस्त है। बस मेरी $ 0.02


30
NOT में क्वेरी उपकुंजी केवल एक बार किया जाता है, EXISTS क्वेरी में सबकुछ हर पंक्ति के लिए किया जाता है
Carrick

1
तुम कमाल हो :) इस तरह से मैंने अपनी 25 सेकंड की क्वेरी को बायें हाथ से इस्तेमाल करते हुए सिर्फ 0.1 सेकंड में बदल दिया
बासेम शाहीन

3
उत्तर किसी विशेष क्रम में नहीं हैं, इसलिए दूसरे उत्तर का मतलब यह नहीं है कि आपने क्या सोचा था।

38

यह शुद्ध सेट सिद्धांत है जिसे आप minusऑपरेशन के साथ प्राप्त कर सकते हैं ।

select id, name from table1
minus
select id, name from table2

क्या आपको लगता है कि यह लेफ्ट जॉइन की तुलना में काफी कुशल है?
उह

यह होना चाहिए। माइनस कमांड को इस सटीक स्थिति के लिए डिज़ाइन किया गया है। बेशक किसी विशेष डेटा सेट के लिए न्याय करने का एकमात्र तरीका यह है कि इसे दोनों तरीकों से आज़माएं और देखें कि कौन सा तेजी से चलता है।
विंटर

9
टी-एसक्यूएल में, सेट ऑपरेटर "छोड़कर" है। यह मेरे लिए बहुत सुविधाजनक है और इससे कोई मंदी नहीं आई है।

2
SQLite में, "माइनस" ऑपरेटर "को छोड़कर" भी है।
जीवनोदय

MySQL MINUS ऑपरेटर का समर्थन नहीं करता है।
मुहम्मद अज़ीम


16

नुकसान के लिए बाहर देखो। यदि फ़ील्ड Nameमें Table1Nulls हैं, तो आप आश्चर्य में हैं। बेहतर है:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT ISNULL(name ,'')
     FROM table1)

1
COALESCE> ISNULL (ISNULL उस भाषा के लिए एक बेकार T-SQL जोड़ है जो COALESCE से कुछ भी नया या बेहतर नहीं है)
Kris

14

यहाँ क्या मेरे लिए सबसे अच्छा काम किया है।

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

यह मेरे द्वारा किए गए किसी भी अन्य तरीके के मुकाबले दोगुना अधिक था।


धन्यवाद, यह बड़ी मात्रा में डेटा के साथ अच्छी तरह से काम करता है! लेकिन मैं सिर्फ 'छोड़कर' शब्द के बारे में सोच रहा हूं।
पाटसनलाइनर



1

क्वेरी देखें:

SELECT * FROM Table1 WHERE
id NOT IN (SELECT 
        e.id
    FROM
        Table1 e
            INNER JOIN
        Table2 s ON e.id = s.id);

वैचारिक रूप से यह होगा: मिलान में रिकॉर्ड्स को सबक्वेरी में लाना और फिर मुख्य क्वेरी में उन रिकॉर्ड्स को लाना जो सब-वे में नहीं हैं।


0

मैं सही उत्तर में (क्योंकि मैं अभी तक टिप्पणी करने के लिए पर्याप्त शांत नहीं हूं) में जा रहा हूं .... अगर किसी और ने सोचा कि इसे बेहतर व्याख्या की आवश्यकता है।

SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL

और मैंने MySQL में टेबल नामों के बीच से कॉमाक्स की जरूरत में सिंटैक्स देखा है, लेकिन sqlLite में यह स्थान पसंद करने के लिए लग रहा था।

लब्बोलुआब यह है कि जब आप खराब चर नामों का उपयोग करते हैं तो यह प्रश्न छोड़ देता है। मेरे चरों को अधिक समझ में आना चाहिए। और किसी को यह समझाना चाहिए कि हमें अल्पविराम या कोई अल्पविराम क्यों चाहिए।


0

यदि आप विशिष्ट उपयोगकर्ता में चयन करना चाहते हैं

SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)

tent_npkएक उपयोगकर्ता के एक प्राथमिक कुंजी है

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