Oracle डेटाबेस में किसी तालिका से डुप्लिकेट पंक्तियों को हटाने के लिए यहां कुछ विकल्प दिए गए हैं, जब उन पंक्तियों में प्राथमिक कुंजी या विशिष्ट पहचानकर्ता कॉलम होता है।
ऐसे मामलों में, डुप्लिकेट पंक्तियों की तुलना करते समय प्राथमिक कुंजी को अनदेखा किया जाना चाहिए (इस तथ्य के कारण कि प्राथमिक कुंजी अद्वितीय मान रखती है)।
नमूना डेटा
हमारे उदाहरण निम्नलिखित डेटा का उपयोग करते हैं:
SELECT * FROM Dogs;
परिणाम:
DOGID | FIRSTNAME | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
2 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |
6 | वाग | जॉनसन |
7 | वाग | जॉनसन |
हम देख सकते हैं कि पहली दो पंक्तियाँ डुप्लीकेट हैं, जैसा कि अंतिम तीन पंक्तियाँ हैं।
DogId
कॉलम अद्वितीय मान रखता है (क्योंकि यह तालिका की प्राथमिक कुंजी है), लेकिन हम डुप्लिकेट की तुलना करते समय उस कॉलम को अनदेखा कर रहे हैं। आपको अक्सर प्राथमिक कुंजियों वाली तालिकाओं को डी-डुप्लिकेट करने की आवश्यकता हो सकती है, और इसलिए निम्न उदाहरणों का उपयोग ऐसा करने के लिए किया जा सकता है।
विकल्प 1
उपरोक्त तालिका को डी-डुप्लिकेट करने के लिए हमारा पहला विकल्प यहां दिया गया है:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
MINUS SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
SELECT * FROM Dogs;
परिणाम:
DOGID | FIRSTNAME | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |
डुप्लिकेट हटा दिए गए हैं (लेकिन प्रत्येक डुप्लिकेट की एक पंक्ति बनी हुई है)।
हम वैकल्पिक रूप से 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 | <थ>अंतिम नाम|
---|---|---|
2 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
7 | वाग | जॉनसन |
ध्यान दें कि मैंने 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 | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |
विकल्प 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 | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |
विकल्प 5
Oracle की प्रत्येक पंक्ति में एक rowid
होता है स्यूडोकॉलम जो पंक्ति का पता देता है। rowid
तालिका में पंक्तियों के लिए एक अद्वितीय पहचानकर्ता है, और आमतौर पर इसका मान विशिष्ट रूप से डेटाबेस में एक पंक्ति की पहचान करता है (हालांकि यह ध्यान रखना महत्वपूर्ण है कि एक ही क्लस्टर में एक साथ संग्रहीत विभिन्न तालिकाओं में पंक्तियों में एक ही 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 | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |
हालांकि यह उदाहरण थोड़ा अनावश्यक लग सकता है, यह देखते हुए कि हमारे पास पहले से ही एक प्राथमिक कुंजी कॉलम है, ऐसे उदाहरण हो सकते हैं जहां आप rowid
का उपयोग करना पसंद करते हैं। . rowid
यदि आप किसी कारण से प्राथमिक कुंजी कॉलम का उपयोग नहीं कर सकते हैं, या यदि तालिका में प्राथमिक कुंजी नहीं है, तो यह उपयोगी हो सकता है। साथ ही, Oracle के दस्तावेज़ों में उल्लेख किया गया है कि rowid
मान एकल पंक्ति तक पहुँचने का सबसे तेज़ तरीका है।
विकल्प 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 | <थ>अंतिम नाम|
---|---|---|
1 | छाल | स्मिथ |
3 | वूफ़ | जोन्स |
4 | रफ़ | रॉबिन्सन |
5 | वाग | जॉनसन |