Database
 sql >> Datenbank >  >> RDS >> Database

So finden Sie doppelte Werte in einer SQL-Tabelle

Im Allgemeinen empfiehlt es sich, eindeutige Einschränkungen für eine Tabelle festzulegen, um doppelte Zeilen zu verhindern. Es kann jedoch vorkommen, dass Sie mit einer Datenbank arbeiten, in der durch menschliches Versagen, einen Fehler in Ihrer Anwendung oder ungereinigte Daten aus externen Quellen doppelte Zeilen erstellt wurden. In diesem Tutorial erfahren Sie, wie Sie diese doppelten Zeilen finden.

Um mitzumachen, benötigen Sie Lesezugriff auf Ihre Datenbank und ein Tool zum Abfragen Ihrer Datenbank.

Doppelte Kriterien identifizieren

Der erste Schritt besteht darin, Ihre Kriterien für eine doppelte Zeile zu definieren. Benötigen Sie eine Kombination aus zwei Spalten, die zusammen einzigartig sind, oder suchen Sie einfach nach Duplikaten in einer einzelnen Spalte? In diesem Beispiel suchen wir in unserer Benutzertabelle in zwei Spalten nach Duplikaten:Benutzername und E-Mail.

Abfrage schreiben, um zu überprüfen, ob Duplikate vorhanden sind

Die erste Abfrage, die wir schreiben werden, ist eine einfache Abfrage, um zu überprüfen, ob tatsächlich Duplikate in der Tabelle vorhanden sind. Für unser Beispiel sieht meine Abfrage so aus:

SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1

HAVING ist hier wichtig, weil im Gegensatz zu WHERE , HAVING Filter auf Aggregatfunktionen.

Wenn Zeilen zurückgegeben werden, bedeutet dies, dass wir Duplikate haben. In diesem Beispiel sehen unsere Ergebnisse so aus:

Benutzername E-Mail zählen
Peter [email protected] 2
Jessica [email protected] 2
Meilen [email protected] 2

Alle Zeilen auflisten, die Duplikate enthalten

Im vorherigen Schritt hat unsere Abfrage eine Liste von Duplikaten zurückgegeben. Jetzt möchten wir den gesamten Datensatz für jede doppelte Zeile zurückgeben.

Um dies zu erreichen, müssen wir die gesamte Tabelle auswählen und diese mit unseren doppelten Zeilen verbinden. Unsere Abfrage sieht so aus:

SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users 
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email

Wenn Sie genau hinsehen, werden Sie feststellen, dass diese Abfrage nicht so kompliziert ist. Das anfängliche SELECT wählt einfach jede Spalte in der Benutzertabelle aus und verbindet sie dann innerlich mit der duplizierten Datentabelle aus unserer ursprünglichen Abfrage. Da wir die Tabelle mit sich selbst verbinden, ist es notwendig, Aliase zu verwenden (hier verwenden wir a und b), um die beiden Versionen zu kennzeichnen.

So sehen unsere Ergebnisse für diese Abfrage aus:

id Benutzername E-Mail
1 Peter [email protected]
6 Peter [email protected]
12 Jessica [email protected]
13 Jessica [email protected]
2 Meilen [email protected]
9 Meilen [email protected]

Da diese Ergebnismenge alle Zeilen-IDs enthält, können wir sie verwenden, um uns später beim Deduplizieren der Zeilen zu helfen.