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