मैं Oracle में एक तालिका में डुप्लिकेट मान कैसे खोजूं?


276

सबसे सरल एसक्यूएल स्टेटमेंट क्या है जो किसी दिए गए कॉलम के डुप्लिकेट मान और ओरेकल डेटाबेस टेबल में उनके होने की गणना को वापस करेगा?

उदाहरण के लिए: मेरे पास JOBSस्तंभ के साथ एक तालिका है JOB_NUMBER। यदि मेरे पास कोई डुप्लिकेट है JOB_NUMBER, और मुझे कितनी बार डुप्लिकेट किया गया है, तो मुझे कैसे पता चलेगा ?


1
अन्य समाधान stackoverflow.com/questions/4522431/…
zloctb

जवाबों:


608
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

1
धन्यवाद - बस यही जवाब मुझे मिला और आपने मुझे यहाँ वापस पोस्ट करने के लिए पीटा! : ओ)
एंड्रयू

3
आपका स्वागत है। अब मैं गिनती (स्तंभ) और गणना (*) के बीच के अंतर पर अपना प्रश्न पोस्ट करने वाला हूं। :)
छिपकली का बिल

44
+1 4 साल बाद, अभी भी अच्छी तरह से काम करता है, और जब तक वे भी इसमें हैं group by, तब तक कई कॉलम चुनने के लिए समायोजित किया जा सकता है , जैसे: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1;आदि
एमोस एम। बढ़ई

4
या यहां तक ​​कि having count(*) > 1: डी
स्टानिस्लाव ममोनतोव

3
+1 8 साल बाद, अभी भी ओरेकल और MySQL के दोनों नवीनतम संस्करणों के लिए अच्छी तरह से काम करता है (लाइन में होने के बाद फ़ंक्शन को हटा दें)।
फतहवी

58

दूसरा रास्ता:

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

जब सूचकांक होता है तो ठीक (जल्दी पर्याप्त) काम करता है column_name। और डुप्लिकेट पंक्तियों को हटाने या अपडेट करने का यह बेहतर तरीका है।


3
+1 मल्टी-कॉलम डुप्लिकेट के लिए अच्छी तरह से काम करता है (उदाहरण के लिए, जब आप कई कॉलमों पर एक UNIQUE बाधा जोड़ना चाहते हैं), तो मुझे यह दृष्टिकोण ग्रुप द्वारा एक से कम "कठोर" दिखाई दिया, यदि आवश्यक हो तो डुप्लिकेट फ़ील्ड मान + अन्य फ़ील्ड्स को सूचीबद्ध करने के लिए।
फ्रॉस्टी जेड

3
बस स्पष्ट करने के लिए, (यह मेरे लिए पहली बार स्पष्ट नहीं था) यह क्वेरी केवल डुप्लिकेट लौटाती है, यह पहली मूल प्रविष्टि नहीं लौटाती है, यही कारण है कि यह डुप्लिकेट को हटाने के लिए अच्छी तरह से काम करता है, एक अद्वितीय बाधा के आधार पर अधिक से अधिक 1 कॉलम। आप इस क्वेरी के साथ डुप्लिकेट आईडी का चयन कर सकते हैं, और फिर डुप्लिकेट को हटाने के लिए उन का उपयोग कर सकते हैं।
मैथ्यू

1
यदि आप बदलते हैं तो आप डुप्लिकेट होने वाले सभी रिकॉर्ड प्राप्त करेंगे। न सिर्फ दूसरा या तीसरा रिकॉर्ड
moore1emu

33

सबसे सरल मैं सोच सकता हूं:

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;

1
मैं सभी कॉलम कैसे प्राप्त कर सकता हूं?
आसिफ मुश्ताक

2
नौकरियों में से जहाँ job_number का चयन करें (job_number का चयन करें job_number से job_number की गिनती होने पर (*)> 1)
JosephStyons

17

यदि आपको डुप्लिकेट की वास्तविक संख्या जानने की आवश्यकता नहीं है, तो आपको दिए गए कॉलम में भी गिनती करने की आवश्यकता नहीं है। जैसे

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1

7

कैसा रहेगा:

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

ऊपर दिए गए उदाहरण का जवाब देने के लिए, ऐसा लगेगा:

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;

5

मामले में जहां कई कॉलम अद्वितीय पंक्ति (जैसे संबंध तालिका) की पहचान करते हैं, वहां आप निम्नलिखित का उपयोग कर सकते हैं

रो आईडी का उपयोग करें जैसे एम्प_डेप (एम्पिड, डीप्टिड, स्टार्टडेट, एंडडेट) मान लें कि एम्पिड और डीप्टिड अद्वितीय हैं और उस मामले में पंक्ति की पहचान करें

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.rowid <> ied.rowid and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

और यदि ऐसी तालिका में प्राथमिक कुंजी है तो पंक्ति के बजाय प्राथमिक कुंजी का उपयोग करें, उदाहरण के लिए आईडी तब pk है

select oed.empid, count(oed.empid) 
from emp_dept oed 
where exists ( select * 
               from  emp_dept ied 
                where oed.id <> ied.id and 
                       ied.empid = oed.empid and 
                      ied.deptid = oed.deptid )  
        group by oed.empid having count(oed.empid) > 1 order by count(oed.empid);

4

करते हुए

select count(j1.job_number), j1.job_number, j1.id, j2.id
from   jobs j1 join jobs j2 on (j1.job_numer = j2.job_number)
where  j1.id != j2.id
group by j1.job_number

आपको डुप्लिकेट की गई पंक्तियों की आईडी देगा।



2

मैं आमतौर पर Oracle एनालिटिक फंक्शन ROW_NUMBER () का उपयोग करता हूं ।

मान लें कि आप कॉलम पर निर्मित एक अद्वितीय सूचकांक या प्राथमिक कुंजी के बारे में डुप्लिकेट की जांच करना चाहते हैं (c1 , c2, c3)। फिर आप इस तरह से जाएंगे, ROWIDपंक्तियों की संख्या लाते हुए जहां पंक्तियों की संख्या ROW_NUMBER()है >1:

Select * From Table_With_Duplicates
      Where Rowid In
                    (Select Rowid
                       From (Select Rowid,
                                    ROW_NUMBER() Over (
                                            Partition By c1 || c2 || c3
                                            Order By c1 || c2 || c3
                                        ) nbLines
                               From Table_With_Duplicates) t2
                      Where nbLines > 1)


1

मैं इसके पुराने धागे को जानता हूं लेकिन इससे कुछ मदद मिल सकती है।

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

select * from table where column_name in
(select ing.column_name from table ing group by ing.column_name having count(*) > 1)
order by column_name desc;

यदि आवश्यक हो तो जहां क्लॉज में कुछ अतिरिक्त फिल्टर भी जोड़ सकते हैं।


0

1. समाधान

select * from emp
    where rowid not in
    (select max(rowid) from emp group by empno);

इस मूल पोस्टर में कभी हटाने का उल्लेख नहीं किया गया था, केवल गिनती
जेफ

-1

इसके अलावा यू कुछ इस तरह की कोशिश कर सकते हैं कि सभी डुप्लिकेट मानों को एक तालिका में फिर से सूचीबद्ध करें

SELECT count(poid) 
FROM poitem 
WHERE poid = 50 
AND rownum < any (SELECT count(*)  FROM poitem WHERE poid = 50) 
GROUP BY poid 
MINUS
SELECT count(poid) 
FROM poitem 
WHERE poid in (50)
GROUP BY poid 
HAVING count(poid) > 1;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.