मैसकल: किसी तालिका से पंक्तियों का चयन करें जो दूसरे में नहीं हैं


118

एक तालिका में सभी पंक्तियों का चयन कैसे करें जो दूसरे पर दिखाई नहीं देते हैं?

तालिका एक:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

तालिका 2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

तालिका 2 में न होने वाली पंक्तियों के लिए उदाहरण आउटपुट:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

शायद कुछ इस तरह काम करना चाहिए:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)

जवाबों:


96

यदि आपके पास किसी अन्य टिप्पणी में वर्णित के रूप में 300 कॉलम हैं, और आप सभी कॉलमों की तुलना करना चाहते हैं (यह मानते हुए कि कॉलम सभी एक ही नाम हैं), तो आप NATURAL LEFT JOINदो तालिकाओं के बीच सभी मिलान स्तंभ नामों पर एक साथ जुड़ने का उपयोग कर सकते हैं ताकि आप मैन्युअल रूप से सभी ज्वाइन की गई शर्तों को टाइप करने की आवश्यकता नहीं है:

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL

ध्यान दें कि यह केवल उसी उम्मीद के अनुसार काम करता है जब किसी भी कॉलम में NULL का मान न हो। MySQL NULL! = NULL में प्रत्येक पंक्ति जिसमें NULL मान है, भले ही दूसरी तालिका में एक डुप्लिकेट पंक्ति है, तब भी वापस आ जाएगी।
काइल कोचिस

84
यदि आपके पास 300 कॉलम हैं, तो आपको अपने डेटाबेस को फिर से डिज़ाइन करना चाहिए।
इरोब अल असिमी

हे मेरे लिए भी यह काम करता है, धन्यवाद! लेकिन क्या यह एक समस्या है अगर पंक्तियाँ> 300 हैं जैसा कि आपने ऊपर उल्लेख किया है?
thekucays

मैं अभी भी प्रश्न btw के बारे में उलझन में हूँ .. अगर मैं बदल "b। जहां। उदाहरण के लिए" n। "null है" b। क्या फर्क पड़ता है? मुझे यह पूछने के लिए खेद है, मैं अभी भी sql में नया हूँ: D
thekucays

184

आपको कॉलम नाम के आधार पर सबसेलेक्ट करना होगा, नहीं *

उदाहरण के लिए, यदि आपके पास idदोनों तालिकाओं के लिए सामान्य फ़ील्ड है , तो आप ऐसा कर सकते हैं:

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

अधिक उदाहरणों के लिए MySQL सबक्वेरी सिंटैक्स का संदर्भ लें ।


1
स्पष्टीकरण के लिए धन्यवाद! लेकिन मुझे वास्तव में किसी भी क्षेत्र पर पंक्तियों के चयन को आधार बनाने की आवश्यकता नहीं है, क्योंकि मैं पंक्ति में किसी भी क्षेत्र के किसी भी रूपांतर में रुचि रखता हूं ...

यदि तुलना करने के लिए केवल कुछ कॉलम हैं तो आप @ स्टीव के उदाहरण के अनुसार एक जॉइन कर सकते हैं। यदि आप वास्तव में कई स्तंभों के साथ दो तालिकाओं में डेटा की सामान्य तुलना के लिए पूछ रहे हैं, तो आप शायद एक MySQL अंतर उपकरण की तलाश करना चाहते हैं ।
स्टेनी

2
ध्यान दें कि यह हमेशा एक खाली सेट लौटाएगा यदि आप Table2 में जिस कॉलम को देख रहे हैं उसमें नल हैं। यदि आप इसे प्राथमिक कुंजी के आधार पर कर रहे हैं, तो कोई समस्या नहीं है, लेकिन अन्य संदर्भों में इस क्वेरी का उपयोग करने की कोशिश कर रहे लोगों के लिए प्रासंगिक है।
मार्क एमी

4
लेकिन क्या होगा अगर हम बड़े डेटा के बारे में बात कर रहे हैं? और तालिका 2 में 100M पंक्तियाँ हैं, उदाहरण के लिए?
frops

स्मार्ट और चतुर उत्तर। धन्यवाद मेट
अंजना सिल्वा

44
SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)

EXISTS आपकी सहायता करेगा...


2
अच्छा जवाब, बड़े डेटा सेट के लिए किफायती, धन्यवाद।
ekerner

बलवान। बड़े डेटासेट के लिए सर्वश्रेष्ठ उत्तर
इयान चाडविक

35

एक मानक LEFT JOIN समस्या को हल कर सकता है और, यदि इसमें शामिल होने वाले क्षेत्र अनुक्रमित हैं, तो
यह भी तेज होना चाहिए

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null

ठीक है, मुझे लगता है कि यह होना चाहिए, WHERE t2.Birthdate Is Nullइसके बजाय btw क्यों AND t1.Birthdate = t2.Birthdate?

क्योंकि यदि आप इसे जोड़ते हैं, तो हर पंक्ति वापस आ जाएगी, आप कहते हैं कि आउटपुट में केवल पंक्तियाँ नहीं होनी चाहिए दूसरी तालिका में
स्टीव

1
यह एक भयानक जवाब है, क्योंकि इसमें सभी पंक्तियों को वापस करने की आवश्यकता नहीं है Table2!
dotancohen

मैं सहमत हूं, महान जवाब। मेरे पास 4-टेबलों के बीच एक आदमी-कई टेबल है, और अंदर से जुड़ने पर सबसे निश्चित रूप से अधिक किफायती होने जा रहा है।
डॉ।


4

इस सरल प्रश्न का प्रयास करें। यह पूरी तरह से काम करता है।

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);


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