sql: जाँचें कि तालिका A में प्रविष्टि तालिका B में मौजूद है या नहीं


80

मेरे पास एक परिभाषा तालिका है जिसे मैं जानता हूं कि इसे बहुत अच्छी तरह से बनाए नहीं रखा जा रहा है, इस पर कॉल करने देता है table A। मेरे पास एक और तालिका है (इसे कॉल करें table B) जो बहुत छोटी है और आदर्श रूप से होनी चाहिए, subset of table Aलेकिन मुझे पता है कि table Aकुछ बासी है और इसमें नई प्रविष्टियां शामिल नहीं हैं Table B

ध्यान दें, कि टेबल A और B में अलग-अलग कॉलम हैं।

Table A:
ID, Name, blah, blah, blah, blah

Table B:
ID, Name

मैं टेबल बी में सभी पंक्तियों को चाहता हूं कि तालिका ए में आईडी तालिका ए में मौजूद नहीं है। यह तालिका ए में पंक्तियों से मेल नहीं खाती है; मैं तालिका B में केवल पंक्तियाँ चाहता हूँ जहाँ ID तालिका A में बिल्कुल मौजूद नहीं है।

जवाबों:


172
SELECT *
FROM   B
WHERE  NOT EXISTS (SELECT 1 
                   FROM   A 
                   WHERE  A.ID = B.ID)

@ algotr8der, मुझे मदद करने में खुशी हुई। अच्छा दिन।
gdoron

10
select * from TableB b where b.ID not in (select a.ID from TableA a)
vakio

2
@vakio क्वेरी के लिए धन्यवाद। आपको अपनी टिप्पणी निश्चित रूप से उत्तर के रूप में देनी चाहिए।
विश्लेषणात्मक भिक्षु

@AnalyticalMonk मुझे आशा है कि आप जानते हैं कि यह बिलकुल वैसा ही प्रश्न है, जिसके परिणाम ठीक वैसा ही मिलते हैं। बस थोड़ा अलग वाक्यविन्यास, यह सब है
gdoron

2
@ManosKounelakis का Select 1अर्थ है 1प्रत्येक पंक्ति के परिणाम के रूप में वापसी । इसका उपयोग अक्सर यह ध्यान देने के लिए किया जाता है कि परिणाम मायने नहीं रखते लेकिन अकेले अस्तित्व वह है जो मायने रखता है। आप 1प्रत्येक मान्य मान (*, 1,2,3, column1, column2) में बदल सकते हैं और परिणाम नहीं बदलेंगे।
गॉर्डन मोनिका का

28

शास्त्रीय उत्तर जो लगभग हर वातावरण में काम करता है

SELECT ID, Name, blah, blah
FROM TableB TB
LEFT JOIN TableA TA
ON TB.ID=TA.ID
WHERE TA.ID IS NULL

कभी-कभी EXISTS लागू नहीं किया जा सकता है (काम नहीं कर रहा है)।


धन्यवाद, इससे बहुत मदद मिली!
lenach87

यह क्वेरी SELECT * F से B से अधिक कुशल नहीं है (जहां एक WHID A.ID = B.ID से 1 का चयन करें)
teteArg

DUAL सभी Oracle डेटाबेस में डिफ़ॉल्ट रूप से मौजूद एक पंक्ति, एक स्तंभ तालिका है। DUAL का मालिक SYS (SYS डेटा डिक्शनरी का मालिक है, इसलिए DUAL डेटा डिक्शनरी का हिस्सा है।) लेकिन DUAL को हर उपयोगकर्ता द्वारा एक्सेस किया जा सकता है। तालिका में एक एकल VARCHAR2 (1) स्तंभ है जिसे DUMMY कहा जाता है जिसमें 'X' का मान होता है। MySQL DUAL को उन प्रश्नों में एक तालिका के रूप में निर्दिष्ट करने की अनुमति देता है, जिन्हें किसी तालिका से डेटा की आवश्यकता नहीं है। SQL सर्वर में DUAL तालिका मौजूद नहीं है, लेकिन आप एक बना सकते हैं।
डेविड कारियुकी

14

यदि आप EXISTS का उपयोग कर रहे हैं, तो आप SQL सर्वर में नीचे का उपयोग कर सकते हैं:

SELECT * FROM TableB as b
WHERE NOT EXISTS
(
   SELECT * FROM TableA as a
   WHERE b.id = a.id
)


0

या अगर "EXISTS" लागू नहीं हैं

SELECT *
FROM   B
WHERE (SELECT count(*)  FROM   A WHERE  A.ID = B.ID) < 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.