जब उन पंक्तियों में प्राथमिक कुंजी या विशिष्ट पहचानकर्ता कॉलम होता है, तो मारियाडीबी में तालिका से डुप्लिकेट पंक्तियों को हटाने के उदाहरण यहां दिए गए हैं।
उदाहरण डुप्लिकेट पंक्तियों को हटाते हैं लेकिन एक रखते हैं। तो दो समान पंक्तियों के मामले में, यह उनमें से एक को हटा देता है और दूसरे को रखता है।
नमूना डेटा
हमारे उदाहरण निम्नलिखित डेटा का उपयोग करते हैं:
SELECT * FROM Dogs;
परिणाम:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
हम देख सकते हैं कि पहली दो पंक्तियाँ डुप्लिकेट हैं, साथ ही अंतिम तीन पंक्तियाँ भी हैं।
DogId
कॉलम अद्वितीय मान रखता है (क्योंकि यह तालिका की प्राथमिक कुंजी है), और इसलिए, कड़ाई से बोलते हुए, कोई डुप्लिकेट नहीं हैं। लेकिन वास्तविक जीवन स्थितियों में, आप अक्सर उन तालिकाओं को डी-डुप्लिकेट करना चाहेंगे जिनमें प्राथमिक कुंजी होती है। इसलिए, इस लेख में हम प्राथमिक कुंजी की उपेक्षा करते हैं, और हम शेष स्तंभों में डुप्लिकेट मानों का पता लगाते हैं।
विकल्प 1
आइए हटाई जाने वाली सभी पंक्तियों को चुनकर अपना पहला विकल्प शुरू करें:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
परिणाम:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
उन डुप्लिकेट पंक्तियों को हटाने के लिए, हम SELECT *
. को स्विच कर सकते हैं करने के लिए DELETE
:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
परिणाम:
Query OK, 3 rows affected (0.017 sec)
और परिणाम को सत्यापित करने के लिए, हम तालिका में शेष सभी पंक्तियों का चयन कर सकते हैं:
SELECT * FROM Dogs;
परिणाम:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
हम वैकल्पिक रूप से MAX()
. का उपयोग कर सकते हैं MIN()
. के बजाय फ़ंक्शन यह बदलने के लिए कार्य करता है कि कौन सी पंक्तियां हटाई गई हैं।
विकल्प 2
इस उदाहरण में हम मान लेंगे कि तालिका को उसकी मूल स्थिति (डुप्लिकेट के साथ) में पुनर्स्थापित कर दिया गया है।
डुप्लिकेट पंक्तियों की जांच के लिए हम निम्नलिखित क्वेरी का उपयोग कर सकते हैं:
SELECT *
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId = (
SELECT MAX(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
);
परिणाम:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
और हम डुप्लिकेट को हटाने के लिए उस क्वेरी को संशोधित कर सकते हैं:
DELETE FROM Dogs WHERE DogId IN (
SELECT d2.DogId
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId=(
SELECT MIN(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
)
);
परिणाम:
Query OK, 3 rows affected (0.075 sec)
तालिका को अब डी-डुप्लिकेट कर दिया गया है।
हम सभी पंक्तियों को फिर से चुनकर इसे सत्यापित कर सकते हैं:
SELECT * FROM Dogs;
परिणाम:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
हम उपयोग कर सकते हैं MAX()
MIN()
. के बजाय यदि पसंद हो तो डुप्लीकेट से अन्य पंक्तियों को हटाने के लिए।