उन पंक्तियों को बाहर कैसे करें जो किसी अन्य तालिका के साथ शामिल नहीं होती हैं?


86

मेरे पास दो टेबल हैं, एक के पास प्राथमिक कुंजी है और दूसरे के पास एक विदेशी कुंजी है।

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

जवाबों:


269

वैकल्पिक शब्द

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

जुड़ने की पूर्ण छवि वैकल्पिक शब्द

Aticle से: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx


9
आखिरकार! उनके पास पाठ्य पुस्तकों में ये क्यों नहीं हैं और uni में मेरे व्याख्याताओं के पास ये क्यों नहीं हैं?! वे दुनिया में सबसे खराब संभव व्याख्याओं का इस्तेमाल करते थे, न कि इन सबसे दूर!
पायथोनियन

4
यह सोना है। मैं एक ऐसी टिप्पणी लिखने से नफरत करता हूं जिसमें कोई सामग्री नहीं है, लेकिन बहुत ही प्रशंसात्मक है, लेकिन चलो! यह एक कमाल का जवाब है। साभार, @ प्रणय राणा
0xbe5077ed

1
कृपया मेरे लिए समझाएं, B.Key IS NULLलेकिन हम अभी भी तुलनीय क्यों हैं A.Key = B.Key?
Do Nhu Vy

1
@DoNhuVy सरल है, तुलना "ऑन" क्लॉज में है, एक लेफ्ट या राइट जॉइन में, यदि कोई मेलिंग पंक्ति नहीं है तो सभी NULLs के साथ एक पंक्ति शामिल हो जाती है, जिसके बाद आप IS NULL के लिए परीक्षण करते हैं ताकि पता चल सके कि कोई मिलान पंक्ति नहीं है। । (यह केवल काम करता है, वैसे, यदि आप जिस क्षेत्र का परीक्षण कर रहे हैं वह NULL नहीं है, अर्थात किसी अन्य कारण से NULL नहीं हो सकता है)
ग्रेगरी मगर्सक

मैं नीचे दिए गए प्रश्न का उपयोग कर रहा हूं: SELECT A. * FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JacFileId और A.AccountID = B.AccountID WHERE ए। JobFileId IS BULL IS IS BAL IS ISB A.AccountID IS NULL या B.AccountID IS NULL मूल रूप से, मैं "ON" क्लॉज में दो मूल्यों की तुलना कर रहा हूं। यह ठीक काम कर रहा है, लेकिन क्वेरी उन पंक्तियों के लिए अशक्त पंक्ति लौटा रही है जो मेल नहीं खाते हैं। इसे कैसे हल करें? कृपया मदद करें
हर्षशर्मा

10
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

आम तौर पर , (NOT) EXISTSहै तो एक बेहतर विकल्प (NOT) INया(LEFT) JOIN


वैसे उन्होंने DBRMS का उपयोग करने के लिए क्या पोस्ट नहीं किया है, हालांकि MySql LEFT JOINआउटपरफॉर्म मेंNOT EXIST
द स्क्रेम मिस्टर

@ द स्क्रम मिस्टर: क्या मैंने तेजी से कहा? शब्दार्थ और तार्किक अंतर जानने के लिए IN vs EXISTS vs JOIN खोजें ...
gbn

@ क्षमा करें, मुझे लगा कि "बेहतर विकल्प" से आपका मतलब तेज़ है। क्या आप कृपया बता सकते हैं कि यह किस तरह से बेहतर विकल्प है? explainextended.com/2009/09/18/…
द स्क्रीम मिस्टर

1
@ द स्क्रम मिस्टर: आम तौर पर, किसी भी तरह के जॉयइन को डिनस्टसीट की आवश्यकता हो सकती है। सूची में एक अशक्त के साथ नहीं झूठी देता है। IN / EXISTS समान व्यवहार करता है। हालाँकि, केवल "सुरक्षित" निर्माण है (नहीं) जब तक आप असंगति पसंद नहीं करते हैं
gbn




3
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

2
एक सवाल है .. अगर हम हालत का उपयोग कर रहे हैं P.key = S.keyऔर फिर कहते हैं where S.key IS NULL, तो क्या वह P.key को भी अशक्त नहीं बनाता है?
सोमजीत

2

यदि आप फर्स्ट टेबल से कॉलम को चुनना चाहते हैं "जो कि दूसरी तालिका में भी मौजूद हैं, तो इस मामले में आप भी उपयोग कर सकते हैं EXCEPT। इस मामले में, कॉलम के नाम अलग-अलग हो सकते हैं लेकिन डेटा प्रकार समान होना चाहिए।

उदाहरण:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable

0

यह COGNOS में उपयोग करने के लिए मददगार था क्योंकि Cognos में SQL "Not in" स्टेटमेंट बनाने की अनुमति थी, लेकिन इसे चलाने में बहुत लंबा समय लगा। मैंने मैन्युअल रूप से कोड बी को कॉग्नोस में टेबल बी में शामिल होने के लिए ए "के रूप में एआईके" में कोडित किया था, लेकिन "बीक में क्वेरी नहीं हुई थी, लेकिन 5 मिनट के बाद परिणाम लंबे समय तक / वापस नहीं ले रहा था।

किसी और के लिए जो कॉग्नोस में "नॉट इन" समाधान की तलाश में है, यहां मैंने वही किया है। लिंक प्रकार का चयन करके Cognos में एक LEFT JOIN के साथ तालिका A और B से जुड़ने वाली क्वेरी बनाएँ: तालिका A.Key में तालिका B में "0 से N" मान हैं, फिर तालिका B के लिए फ़िल्टर (इन पोज़ टू क्लॉज़ेज़) में एक फ़िल्टर जोड़ा गया। .Key NULL है।

तेजी से भागे और एक आकर्षण की तरह।

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