समस्या:
आपकी तालिका में डुप्लिकेट पंक्तियां हैं, केवल आईडी अद्वितीय हैं। आप उन डुप्लिकेट प्रविष्टियों को कैसे ढूंढते हैं?
उदाहरण:
हमारे डेटाबेस में product
निम्नलिखित कॉलम में डेटा के साथ:id
, name
, और category
।
आईडी | <थ>नामश्रेणी | |
---|---|---|
1 | स्टेक | मांस |
2 | केक | मिठाई |
3 | d>स्टेक | मांस |
4 | पोर्क | मांस |
5 | केक | मिठाई |
6 | केक | मिठाई |
आइए डुप्लिकेट नाम और उत्पादों की श्रेणियां खोजें। आप COUNT
. का उपयोग करके पंक्तियों को समूहीकृत करके डुप्लीकेट ढूंढ सकते हैं एग्रीगेट फ़ंक्शन, और एक HAVING
. निर्दिष्ट करना क्लॉज जिसके साथ पंक्तियों को फ़िल्टर करना है।
समाधान:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
यह क्वेरी केवल डुप्लिकेट रिकॉर्ड लौटाती है—जिनके उत्पाद का नाम और श्रेणी समान होती है:
नाम | श्रेणी |
---|---|
स्टेक | मांस |
केक | मिठाई |
हमारी तालिका में दो डुप्लिकेट उत्पाद हैं:मांस श्रेणी से स्टेक और मिठाई श्रेणी से केक। पहला उत्पाद तालिका में दो बार दोहराया जाता है, जबकि दूसरा तीन बार प्रकट होता है।
चर्चा:
डुप्लिकेट मानों का चयन करने के लिए, आपको समान मानों वाली पंक्तियों के समूह बनाने होंगे और फिर एक से अधिक संख्या वाले समूहों का चयन करना होगा। आप GROUP BY
. का उपयोग करके इसे प्राप्त कर सकते हैं और एक HAVING
खंड।
पहला कदम सभी गैर-आईडी कॉलम में समान मानों वाले रिकॉर्ड के समूह बनाना है (हमारे उदाहरण में, name
और category
) आप इसे GROUP BY
. के साथ करते हैं खंड। GROUP BY
के बाद कीवर्ड, आप उन स्तंभों के नाम डालते हैं जिन्हें आप समूहीकरण के लिए उपयोग करना चाहते हैं। हम id
. को बाहर कर देते हैं कॉलम क्योंकि यह हमारी तालिका की प्राथमिक कुंजी है; परिभाषा के अनुसार, उस कॉलम के तहत प्रत्येक पंक्ति का एक अलग मान होगा। अगर हम इसे शामिल करते हैं, तो हम डुप्लिकेट का पता नहीं लगा पाएंगे!
हम एक से अधिक पंक्तियों वाले समूह खोजना चाहते हैं; ऐसे समूहों में परिभाषा के अनुसार डुप्लीकेट होना चाहिए, जब तक कि हमने सही कॉलम पर समूहीकृत किया है। ऐसा करने के लिए, हम एक HAVING
. का उपयोग करते हैं खंड। हमारे द्वारा निर्दिष्ट शर्त यह है कि समूह में तत्वों की संख्या—COUNT(id)
—एक से बड़ा होना चाहिए:COUNT(id) > 1
. याद रखें कि HAVING
आपको समूहों को फ़िल्टर करने की अनुमति देता है; WHERE
अलग-अलग पंक्तियों को फ़िल्टर करने के लिए है।