समाधान के बारे में चेतावनी:
यदि कोई गलत नहीं है, तो कई मामलों में जाँच के नतीजे मिलेंगे
यदि आप टेबल बनाने वाले एकमात्र व्यक्ति हैं, तो यह प्रासंगिक नहीं हो सकता है, लेकिन कई समाधान प्रश्न में कोड से अलग-अलग आउटपुट पंक्तियाँ देंगे, जब किसी एक तालिका में अद्वितीय पंक्तियाँ नहीं हो सकती हैं।
समस्या निवारण के बारे में चेतावनी:
कई रंगों के साथ, ऐसा नहीं है कि, आप क्या चाहते हैं
जब मैं दो कॉलम के साथ एक देखता हूं, तो मैं इसका मतलब दो चीजों से कर सकता हूं:
- कॉलम ए और कॉलम बी का मूल्य स्वतंत्र रूप से दूसरी तालिका में दिखाई देता है
- कॉलम ए और कॉलम बी के मूल्य एक ही पंक्ति में दूसरी तालिका में दिखाई देते हैं
परिदृश्य 1 काफी तुच्छ है, बस दो IN कथनों का उपयोग करें।
अधिकांश मौजूदा उत्तरों के साथ, मैं यहां परिदृश्य 2 और (संक्षिप्त निर्णय) के लिए उल्लिखित और अतिरिक्त तरीकों का अवलोकन प्रदान करता हूं:
EXISTS (सुरक्षित, SQL सर्वर के लिए अनुशंसित)
जैसा कि @mrdenny द्वारा दिया गया है, EXISTS बिल्कुल वही लगता है जो आप देख रहे हैं, यहाँ उसका उदाहरण है:
SELECT * FROM T1
WHERE EXISTS
(SELECT * FROM T2
WHERE T1.a=T2.a and T1.b=T2.b)
बायाँ सामी जॉय (सुरक्षित, इसका समर्थन करने वाली बोलियों के लिए अनुशंसित)
यह शामिल होने का एक बहुत ही संक्षिप्त तरीका है, लेकिन दुर्भाग्यवश SQL सर्वर सहित अधिकांश SQL बोलियाँ वर्तमान में इसका समर्थन नहीं करती हैं।
SELECT * FROM T1
LEFT SEMI JOIN T2 ON T1.a=T2.a and T1.b=T2.b
एकाधिक कथन (सुरक्षित, लेकिन कोड दोहराव से सावधान रहें)
जैसा कि @ इन स्टेटमेंट्स में दो स्टेटमेंट्स का उपयोग करके @cataclysm द्वारा उल्लेख किया गया है, शायद यह अन्य समाधानों को बेहतर बनाएगा। हालाँकि, आपको जो कोड के साथ बहुत सावधानी बरतनी चाहिए। यदि आप कभी भी किसी भिन्न तालिका से चयन करना चाहते हैं, या जहां कथन को बदलना चाहते हैं, तो यह एक बढ़ा हुआ जोखिम है जो आप अपने तर्क में असंगति पैदा करते हैं।
मूल समाधान
SELECT * from T1
WHERE a IN (SELECT a FROM T2 WHERE something)
AND b IN (SELECT b FROM T2 WHERE something)
कोड दोहराव के बिना समाधान (मेरा मानना है कि यह नियमित SQL सर्वर प्रश्नों में काम नहीं करता है)
WITH mytmp AS (SELECT a, b FROM T2 WHERE something);
SELECT * from T1
WHERE a IN (SELECT a FROM mytmp)
AND b IN (SELECT b FROM mytmp)
ININ JOIN (तकनीकी रूप से इसे सुरक्षित बनाया जा सकता है, लेकिन अक्सर ऐसा नहीं किया जाता है)
कारण है कि मैं एक फिल्टर के रूप में एक आंतरिक जुड़ाव का उपयोग करने की अनुशंसा नहीं करता हूं, ऐसा इसलिए है क्योंकि व्यवहार में लोग अक्सर सही तालिका में डुप्लिकेट को बाईं तालिका में डुप्लिकेट का कारण बनाते हैं। और फिर मामले को बदतर बनाने के लिए, वे कभी-कभी अंतिम परिणाम को अलग बनाते हैं जबकि बाईं तालिका वास्तव में अद्वितीय (या आपके द्वारा चुने गए स्तंभों में अद्वितीय नहीं) होने की आवश्यकता नहीं हो सकती है। Futhermore यह आपको वास्तव में एक स्तंभ का चयन करने का मौका देता है जो बाईं तालिका में मौजूद नहीं है।
SELECT T1.* FROM T1
INNER JOIN
(SELECT DISTINCT a, b FROM T2) AS T2sub
ON T1.a=T2sub.a AND T1.b=T2sub.b
सबसे आम गलतियाँ:
- टी 2 पर सीधे जुड़ना, एक सुरक्षित उपकुंजी के बिना। नकल के जोखिम में परिणाम)
- चुनें * (T2 से कॉलम प्राप्त करने के लिए प्रेरित किया गया)
- सेलेक्ट सी (यह गारंटी नहीं देता है कि आपका कॉलम आता है और हमेशा T1 से आएगा)
- कोई DISTINCT या DISTINCT गलत जगह पर नहीं है
सेपरेटर के साथ रंग का संयोजन (बहुत सुरक्षित नहीं, भयानक प्रदर्शन)
कार्यात्मक समस्या यह है कि यदि आप एक विभाजक का उपयोग करते हैं जो एक कॉलम में हो सकता है, तो यह सुनिश्चित करने के लिए मुश्किल हो जाता है कि परिणाम 100% सटीक है। तकनीकी समस्या यह है कि यह विधि अक्सर प्रकार के रूपांतरणों को उकसाती है और अनुक्रमणिका को पूरी तरह से अनदेखा करती है, जिसके परिणामस्वरूप संभवतः भयानक प्रदर्शन होता है। इन समस्याओं के बावजूद, मुझे यह स्वीकार करना होगा कि मैं कभी-कभी छोटे डेटासेट पर तदर्थ प्रश्नों के लिए भी इसका उपयोग करता हूं।
SELECT * FROM T1
WHERE CONCAT(a,"_",b) IN
(SELECT CONCAT(a,"_",b) FROM T2)
ध्यान दें कि यदि आपके कॉलम संख्यात्मक हैं, तो कुछ SQL बोलियों के लिए आपको उन्हें पहले तार पर ले जाना होगा। मेरा मानना है कि SQL सर्वर स्वचालित रूप से ऐसा करेगा।
चीजों को लपेटने के लिए: हमेशा की तरह एसक्यूएल में ऐसा करने के कई तरीके हैं, सुरक्षित विकल्पों का उपयोग करने से सुपरराइज से बचा जा सकता है और आपको लंबे समय में समय और सिर की बचत होगी।