निम्नलिखित उदाहरण 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
के साथ तालिका से डुप्लिकेट पंक्तियों को हटाने के लिए।