Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle में प्राथमिक कुंजी वाली डुप्लिकेट पंक्तियों को हटाने के 6 तरीके

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 वाग जॉनसन

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डाटाबेस प्रमाणन परीक्षा के 50 प्रकार

  2. Oracle को विदेशी कुंजियाँ मिलती हैं

  3. वेब एप्लिकेशन में समय क्षेत्र को संभालना

  4. एक रिपोर्ट में बारकोड \ या कई बारकोड के साथ कई रिपोर्ट कैसे प्रिंट करें

  5. ओपन वर्ल्ड 2013 से वापस