sql - मैं ओरेकल में किसी तालिका में डुप्लिकेट मान कैसे प्राप्त करूं?




oracle duplicate-data (8)

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

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;

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

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


ऐसा करने के लिए एक SQL अनुरोध यहां दिया गया है:

select column_name, count(1)
from table
group by column_name
having count (column_name) > 1;

कैसा रहेगा:

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

उपर्युक्त उदाहरण का उत्तर देने के लिए, यह इस तरह दिखेगा:

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

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

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

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


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

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

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

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

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);

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

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);

1. समाधान

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

SELECT   SocialSecurity_Number, Count(*) no_of_rows
FROM     SocialSecurity 
GROUP BY SocialSecurity_Number
HAVING   Count(*) > 1
Order by Count(*) desc 




duplicate-data