Wie finde ich doppelte Werte in SQL Server?
In diesem Artikel erfahren Sie, wie Sie mithilfe von SQL doppelte Werte in einer Tabelle oder Ansicht finden. Wir werden den Prozess Schritt für Schritt durchlaufen. Wir beginnen mit einem einfachen Problem und bauen die SQL langsam auf, bis wir das Endergebnis erreichen.
Am Ende werden Sie das Muster verstehen, das zum Identifizieren doppelter Werte verwendet wird, und in der Lage sein, in zu verwenden Ihre Datenbank.
Alle Beispiele für diese Lektion basieren auf Microsoft SQL Server Management Studio und der AdventureWorks2012-Datenbank. Sie können mit diesen kostenlosen Tools in meinem Handbuch Erste Schritte mit SQL Server beginnen.
Doppelte Werte in SQL Server suchen
Beginnen wir. Wir werden diesen Artikel auf eine reale Anfrage stützen. Der Personalmanager möchte, dass Sie alle Mitarbeiter finden, die denselben Geburtstag haben. Sie möchte, dass die Liste nach Geburtsdatum und Mitarbeitername sortiert wird.
Nach dem Betrachten der Datenbank wird deutlich, dass die Tabelle HumanResources.Employee verwendet werden muss, da sie Geburtsdaten von Mitarbeitern enthält.
At Auf den ersten Blick scheint es ziemlich einfach zu sein, doppelte Werte in SQL Server zu finden. Schließlich können wir die Daten leicht sortieren.
Aber sobald die Daten sortiert sind, wird es schwieriger! Da SQL eine satzbasierte Sprache ist, gibt es außer der Verwendung von Cursorn keine einfache Möglichkeit, die Werte des vorherigen Datensatzes zu ermitteln.
Wenn wir diese kennen würden, könnten wir nur die Werte vergleichen und wann sie die waren Kennzeichnen Sie die Datensätze als Duplikate.
Glücklicherweise gibt es für uns eine andere Möglichkeit, dies zu tun. Wir verwenden einen INNER JOIN, um die Geburtstage der Mitarbeiter abzugleichen. Auf diese Weise erhalten wir eine Liste der Mitarbeiter, die dasselbe Geburtsdatum haben.
Dies wird ein Build-as-you-go-Artikel sein. Ich beginne mit einer einfachen Abfrage, zeige Ergebnisse und zeige auf, was verfeinert werden muss, und gehe weiter. Wir beginnen mit dem Abrufen einer Liste der Mitarbeiter und ihrer Geburtsdaten.
Schritt 1 – Abrufen einer Liste der Mitarbeiter nach Geburtsdatum sortiert
Wenn Sie mit SQL arbeiten, insbesondere in unbekanntem Gebiet, Ich halte es für besser, eine Anweisung in kleinen Schritten zu erstellen und die Ergebnisse zu überprüfen, als die „endgültige“ SQL in einem Schritt zu schreiben, um nur festzustellen, dass ich eine Fehlerbehebung durchführen muss.
Hinweis: Wenn Wenn Sie mit einer sehr großen Datenbank arbeiten, kann es sinnvoll sein, eine kleinere Kopie als Entwickler- oder Testversion zu erstellen und diese zum Schreiben Ihrer Abfragen zu verwenden. Auf diese Weise können Sie die Leistung der Produktionsdatenbank nicht beeinträchtigen und alle auf den Prüfstand stellen Sie.
In unserem ersten Schritt werden wir alle Mitarbeiter auflisten. Dazu verbinden wir die Mitarbeitertabelle mit der Personentabelle, damit wir den Namen des Mitarbeiters erhalten können.
Hier ist die bisherige Abfrage
SELECT E1.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Wenn Sie sich das Ergebnis ansehen, sehen Sie, dass wir alle Elemente der Anfrage des Personalmanagers haben, außer dem Wir zeigen jeden Mitarbeiter
an
Im nächsten Schritt richten wir die Ergebnisse so ein, dass wir beginnen können, Geburtsdaten zu vergleichen, um doppelte Werte zu finden.
SCHRITT 2 – Vergleichen Sie Geburtsdaten, um doppelte Werte zu identifizieren.
Nun das Wir haben eine Liste von Mitarbeitern, die wir jetzt benötigen, um Geburtsdaten zu vergleichen, damit wir Mitarbeiter mit denselben Geburtsdaten identifizieren können. Im Allgemeinen handelt es sich um doppelte Werte.
Um den Vergleich durchzuführen, führen wir einen Self-Join für die Mitarbeitertabelle durch. Ein Self-Join ist nur eine vereinfachte Version eines INNER JOIN. Wir beginnen mit BirthDate als Beitrittsbedingung. Dadurch wird sichergestellt, dass nur Mitarbeiter mit demselben Geburtsdatum abgerufen werden.
SELECT E1.BusinessEntityID, E2.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDateORDER BY E1.BirthDate, FullName
Ich habe der Abfrage E2.BusinessEntityID hinzugefügt, damit Sie den Primärschlüssel von beiden vergleichen können E1 und E2. In vielen Fällen sehen Sie, dass sie identisch sind.
Der Grund, warum wir uns auf BusinessEntityID konzentrieren, ist, dass es sich um den Primärschlüssel und die eindeutige Kennung für die Tabelle handelt. Es wird zu einem äußerst präzisen und praktischen Mittel, um die Ergebnisse einer Zeile zu identifizieren und ihre Quelle zu verstehen.
Wir nähern uns dem Erreichen unseres Endergebnisses, aber sobald Sie die Ergebnisse überprüft haben, werden Sie sehen, dass wir Nehmen Sie den gleichen Datensatz sowohl im E1- als auch im E2-Match auf.
Überprüfen Sie die rot eingekreisten Elemente. Dies sind die Fehlalarme, die wir aus unseren Ergebnissen entfernen müssen. Dies sind die gleichen Zeilen, die mit sich selbst übereinstimmen.
Die gute Nachricht ist, dass wir fast nur die Duplikate identifizieren.
Ich habe ein 100% garantiertes Duplikat in Blau eingekreist. Beachten Sie, dass die BusinessEntityIDs unterschiedlich sind. Dies zeigt an, dass der Self-Join mit dem Geburtsdatum in verschiedenen Zeilen übereinstimmt – echte Duplikate, um sicherzugehen.
Im nächsten Schritt werden wir diese falsch positiven Ergebnisse direkt aus unseren Ergebnissen entfernen.
Schritt 3 – Übereinstimmungen in derselben Zeile entfernen – False Positives entfernen
Im vorherigen Schritt haben Sie möglicherweise festgestellt, dass alle falsch positiven Übereinstimmungen dieselbe BusinessEntityID haben. wohingegen die wahren Duplikate nicht gleich waren.
Dies ist unser großer Hinweis.
Wenn wir nur Duplikate sehen möchten, müssen wir nur Übereinstimmungen von dem Join zurückbringen, bei dem die BusinessEntityID-Werte sind nicht gleich.
Dazu können wir
E2.BusinessEntityID <> E1.BusinessEntityID
als Join-Bedingung zu unserem Self-Join hinzufügen. Ich habe die hinzugefügte Bedingung rot gefärbt.
SELECT E1.BusinessEntityID, E2.BusinessEntityID, P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Sobald diese Abfrage ausgeführt wird, werden weniger und nur noch verbleibende Zeilen in den Ergebnissen angezeigt sind wirklich Duplikate.
Da dies eine Geschäftsanfrage war, bereinigen wir die Abfrage, sodass nur die angeforderten Informationen angezeigt werden.
Schritt 4 – Letzte Berührungen
Lassen Sie uns Entfernen Sie die BusinessEntityID-Werte aus der Abfrage. Sie waren nur da, um uns bei der Fehlerbehebung zu helfen.
Die endgültige Abfrage ist hier aufgeführt.
SELECT P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Und hier sind die Ergebnisse, denen Sie präsentieren können der Personalmanager!
Mark, einer meiner Leser, hat mich darauf hingewiesen, dass bei drei Mitarbeitern mit demselben Geburtsdatum Duplikate in den Endergebnissen vorhanden sind. Ich habe dies und das überprüft. Um eine Liste zurückzugeben, in der jedes Duplikat nur einmal angezeigt wird, können Sie die DISTINCT-Klausel verwenden. Diese Abfrage funktioniert in allen Fällen:
SELECT DISTINCT P.FirstName + " " + p.LastName AS FullName, E1.BirthDateFROM HumanResources.Employee AS E1 INNER JOIN Person.Person AS P ON P.BusinessEntityID = E1.BusinessEntityID INNER JOIN HumanResources.Employee AS E2 ON E2.BirthDate = E1.BirthDate AND E2.BusinessEntityID <> E1.BusinessEntityIDORDER BY E1.BirthDate, FullName
Abschließende Kommentare
Zusammenfassend sind hier die Schritte aufgeführt, die wir unternommen haben, um doppelte Daten in unserer Tabelle zu identifizieren
- Wir haben zuerst eine Abfrage der Daten erstellt, die wir anzeigen möchten. In unserem Beispiel war dies der Mitarbeiter und sein Geburtsdatum.
- Wir haben einen Self-Join durchgeführt, INNER JOIN an derselben Tabelle in Geek Speak, und das Feld verwendet, das wir als dupliziert erachteten. In unserem Fall wollten wir doppelte Geburtstage finden.
- Schließlich haben wir Übereinstimmungen mit derselben Zeile eliminiert, indem wir Zeilen ausgeschlossen haben, in denen die Primärschlüssel identisch waren.
Indem wir a genommen haben Schritt für Schritt können Sie sehen, dass wir beim Erstellen der Abfrage viel Rätselraten erledigt haben.
Wenn Sie die Art und Weise verbessern möchten, wie Sie Ihre Abfragen schreiben, oder wenn Sie nur durch all das verwirrt sind und suchen Um den Nebel zu beseitigen, kann ich meinem Leitfaden Drei Schritte zu besserem SQL vorschlagen.