Frage

Was ist die einfachste SQL-Anweisung, die die doppelten Werte für eine bestimmte Spalte und die Zahl ihrer Vorkommen in einer Oracle-Datenbank-Tabelle zurück?

Zum Beispiel: Ich habe eine JOBS Tabelle mit der Spalte JOB_NUMBER. Wie kann ich herausfinden, ob ich alle doppelten JOB_NUMBERs haben, und wie oft sie dupliziert werden?

War es hilfreich?

Lösung

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

Andere Tipps

Eine andere Möglichkeit:

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

Adaequat (schnell genug), wenn Index auf column_name ist. Und es ist besser Weg, um doppelte Zeilen zu löschen oder zu aktualisieren.

Einfachstes ich mir vorstellen kann:

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

Sie müssen nicht einmal in den zurückgegebenen Spalten die Zählung haben, wenn Sie die tatsächliche Anzahl der Duplikate nicht wissen müssen. z.

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

Wie wäre:

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

das obige Beispiel zu beantworten, es würde so aussehen:

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

Für den Fall, in dem mehrere Spalten identifizieren eindeutige Zeilen (z Beziehungen Tabelle) dort können Sie folgende verwenden

Verwenden Reihe id   z.B. emp_dept (empid, deptid, startdate, enddate)    nehme empid und deptid sind einzigartig und identifizieren Reihe in diesem Fall

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

und wenn eine solche Tabelle Primärschlüssel dann Primärschlüssel anstelle von Rowid, z id ist pk dann

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

Sie

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

geben Sie die duplizierte Zeilen Ide.

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

ich in der Regel verwenden Oracle Analytic Funktion ROW_NUMBER () .

Sagen Sie bitte die Duplikate überprüfen möchten Sie haben einen eindeutigen Index oder Primärschlüssel auf Säulen gebaut in Bezug auf (c1, c2, c3). Dann werden Sie diesen Weg gehen, Erziehung ROWID s von Zeilen, in denen die Anzahl der Zeilen von ROW_NUMBER() gebracht ist >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)

Hier ist eine SQL-Anfrage, das zu tun:

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

Ich weiß, ihr einen alten Thread aber das kann jemand helfen.

Wenn Sie andere Spalten der Tabelle drucken, während für doppelte Verwendung Überprüfung unten:

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;

können auch einige zusätzliche Filter in der where-Klausel hinzufügen, wenn nötig.

1. Lösung

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

Auch u kann so etwas wie diese versuchen, alle doppelten Werte in einer Tabelle aufzulisten sagen 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top