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

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

निम्नलिखित उदाहरण Oracle डेटाबेस तालिका से डुप्लिकेट पंक्तियाँ लौटाते हैं।

नमूना डेटा

मान लीजिए हमारे पास निम्न डेटा वाली एक तालिका है:

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    

पहली दो पंक्तियाँ डुप्लिकेट हैं, जैसा कि अंतिम तीन पंक्तियाँ हैं। इस मामले में डुप्लिकेट पंक्तियों में आईडी कॉलम सहित सभी कॉलम में डुप्लिकेट मान होते हैं।

विकल्प 1

हम निम्नलिखित क्वेरी का उपयोग यह देखने के लिए कर सकते हैं कि कितनी पंक्तियाँ डुप्लिकेट हैं:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY PetId;

परिणाम:

PETID	PETNAME	PETTYPE	Count
1	Wag	Dog	2
2	Scratch	Cat	1
3	Tweet	Bird	1
4	Bark	Dog	3

हमने पंक्तियों को सभी स्तंभों द्वारा समूहीकृत किया, और प्रत्येक समूह की पंक्ति गणना लौटा दी। 1 से अधिक गिनती वाली कोई भी पंक्ति डुप्लीकेट होती है।

हम इसे अवरोही क्रम में गिनती के आधार पर ऑर्डर कर सकते हैं, ताकि सबसे अधिक डुप्लिकेट वाली पंक्तियाँ पहले दिखाई दें:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY Count(*) DESC;

परिणाम:

PETID	PETNAME	PETTYPE	Count
4	Bark	Dog	3
1	Wag	Dog	2
2	Scratch	Cat	1
3	Tweet	Bird	1

विकल्प 2

यदि हम केवल डुप्लिकेट पंक्तियों को सूचीबद्ध करना चाहते हैं, तो हम HAVING . का उपयोग कर सकते हैं क्लॉज केवल 1 से अधिक की गिनती वाली पंक्तियों को वापस करने के लिए:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC;

परिणाम:

PETID	PETNAME	PETTYPE	Count
4	Bark	Dog	3
1	Wag	Dog	2

विकल्प 3

एक अन्य विकल्प ROW_NUMBER() . का उपयोग करना है विंडो फ़ंक्शन:

SELECT 
    PetId,
    PetName,
    PetType,
    ROW_NUMBER() OVER ( 
        PARTITION BY PetId, PetName, PetType 
        ORDER BY PetId, PetName, PetType
        ) AS rn
FROM Pets;

परिणाम:

PETID	PETNAME	PETTYPE	RN
1	Wag	Dog	1
1	Wag	Dog	2
2	Scratch	Cat	1
3	Tweet	Bird	1
4	Bark	Dog	1
4	Bark	Dog	2
4	Bark	Dog	3

PARTITION BY क्लॉज FROM . द्वारा निर्मित परिणाम सेट को विभाजित करता है विभाजन में खंड जिस पर फ़ंक्शन लागू होता है। जब हम परिणाम सेट के लिए विभाजन निर्दिष्ट करते हैं, तो प्रत्येक विभाजन नंबरिंग को फिर से शुरू करने का कारण बनता है (यानी प्रत्येक विभाजन में पहली पंक्ति के लिए नंबरिंग 1 से शुरू होगी)।

विकल्प 4

हम उपरोक्त क्वेरी को एक सामान्य तालिका अभिव्यक्ति के रूप में उपयोग कर सकते हैं:

WITH cte AS 
    (
        SELECT 
            PetId,
            PetName,
            PetType,
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
SELECT * FROM cte WHERE Row_Number <> 1;

परिणाम:

PETID	PETNAME	PETTYPE	ROW_NUMBER
1	Wag	Dog	2
4	Bark	Dog	2
4	Bark	Dog	3

यह मिलान करने वाले डुप्लीकेट से केवल अतिरिक्त पंक्तियां देता है। तो यदि दो समान पंक्तियां हैं, तो यह उनमें से एक लौटाती है। यदि तीन समान पंक्तियाँ हैं, तो यह दो देता है, और इसी तरह।

विकल्प 5

यह देखते हुए कि हमारी तालिका में प्राथमिक कुंजी कॉलम नहीं है, हम Oracle के rowid . का लाभ उठा सकते हैं स्यूडोकॉलम:

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

इसके काम करने का तरीका यह है कि Oracle डेटाबेस की प्रत्येक पंक्ति में एक rowid होता है स्यूडोकॉलम जो पंक्ति का पता देता है। rowid तालिका में पंक्तियों के लिए एक विशिष्ट पहचानकर्ता है, और आमतौर पर इसका मान विशिष्ट रूप से डेटाबेस में एक पंक्ति की पहचान करता है। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि एक ही क्लस्टर में एक साथ संग्रहीत विभिन्न तालिकाओं में पंक्तियों में एक ही rowid हो सकता है ।

उपरोक्त उदाहरण का एक लाभ यह है कि हम SELECT * . को बदल सकते हैं DELETE के साथ तालिका को धोखा देने के लिए।

विकल्प 6

और अंत में, यहां एक और विकल्प है जो rowid . का उपयोग करता है छद्म स्तंभ:

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

पिछले उदाहरण के समान परिणाम।

पिछले उदाहरण की तरह, हम SELECT * . को बदल सकते हैं DELETE के साथ तालिका से डुप्लिकेट पंक्तियों को हटाने के लिए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLcl (Oracle) का उपयोग करते समय किसी XML फ़ाइल में क्वेरी परिणाम निर्यात करें

  2. टाइमस्टैम्प में दिन जोड़ें

  3. एक टेबल पर CONNECT BY LEVEL अतिरिक्त पंक्तियाँ क्यों लौटाता है?

  4. एक स्ट्रिंग के लिए to_char(myDate, 'DAY') के परिणाम की तुलना करते समय समस्या

  5. DBMS_JOB बनाम DBMS_SCHEDULER