SQLite में डुप्लिकेट पंक्तियों को हटाने के लिए निम्न विकल्पों का उपयोग किया जा सकता है।
ये उदाहरण डुप्लिकेट पंक्तियों को हटाते हैं लेकिन एक रखते हैं। इसलिए यदि उदाहरण के लिए तीन समान पंक्तियाँ हैं, तो यह उनमें से दो को हटा देती है और एक को रख देती है। इसे अक्सर टेबल को डी-डुपिंग कहा जाता है।
नमूना डेटा
मान लीजिए हमारे पास निम्न डेटा वाली एक तालिका है:
SELECT * FROM Pets;
परिणाम:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
हम देख सकते हैं कि पहली दो पंक्तियाँ डुप्लीकेट हैं, जैसा कि अंतिम तीन पंक्तियाँ हैं।
इस मामले में, सभी कॉलम डुप्लिकेट हैं। कोई प्राथमिक कुंजी नहीं है। PetId
कॉलम दिख सकता है जैसे कि यह एक प्राथमिक कुंजी हो सकती है, लेकिन इसमें वास्तव में डुप्लिकेट मान होते हैं। इसलिए, यह प्रत्येक पंक्ति के लिए एक अद्वितीय पहचानकर्ता नहीं है, और इसे प्राथमिक कुंजी के रूप में उपयोग नहीं किया जा सकता है।
यदि कोई प्राथमिक कुंजी थी, तो इसमें सभी पंक्तियों में अद्वितीय मान होंगे, और कोई डुप्लिकेट नहीं होगा।
किसी भी स्थिति में, डुप्लिकेट पंक्तियों को खोजने और हटाने के लिए नीचे दो विकल्प दिए गए हैं।
विकल्प 1
तालिका को डी-डुप्लिकेट करने से पहले, हम निम्न क्वेरी का उपयोग करके देख सकते हैं कि कौन सी पंक्ति/पंक्तियों को हटा दिया जाएगा:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
परिणाम:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
यह हमें दिखाता है कि जब हम अगले चरण में तालिका को डी-डुप्लिकेट करेंगे तो तीन पंक्तियां हटा दी जाएंगी।
डुप्लिकेट मानों को हटाने के लिए, हम SELECT *
. को बदलकर उपरोक्त क्वेरी को संशोधित कर सकते हैं DELETE
के साथ :
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
परिणाम:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
तालिका को अब डी-डुप्लिकेट कर दिया गया है।
जैसा कि अपेक्षित था, हमारे कुत्ते "वाग" के लिए डुप्लिकेट पंक्तियों में से एक को हटा दिया गया है और दूसरा बना हुआ है। "बार्क" के लिए दो डुप्लिकेट पंक्तियों को भी हटा दिया गया है।
SQLite के rowid
. के कारण हम ऐसा करने में सक्षम हुए हैं . डिफ़ॉल्ट रूप से, SQLite में प्रत्येक पंक्ति में एक विशेष कॉलम होता है, जिसे आमतौर पर rowid
कहा जाता है। , जो विशिष्ट रूप से तालिका के भीतर उस पंक्ति की पहचान करता है। जब तक इसे तालिका से स्पष्ट रूप से हटा नहीं दिया जाता है, आप इसे प्रत्येक पंक्ति के लिए एक विशिष्ट पहचानकर्ता के रूप में उपयोग कर सकते हैं, जो हमें उपरोक्त प्रश्नों को बनाने में सक्षम बनाता है। अगले उदाहरण पर भी यही बात लागू होती है।
विकल्प 2
यह मानते हुए कि तालिका को उसके मूल डेटा (डुप्लिकेट पंक्तियों सहित) के साथ बहाल कर दिया गया है, इसे डी-डुप्लिकेट करने का एक और विकल्प है।
जांचें कि कौन सी पंक्तियां हटा दी जाएंगी:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
परिणाम:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
अब उन पंक्तियों को हटा दें:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
परिणाम:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
तालिका को धोखा दिया गया है।