Betrachten Sie eine Spalte mit dem Namen EmployeeName
table Employee
. Ziel ist es, wiederholte Datensätze basierend auf dem EmployeeName
Feld zu löschen .
EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
Mit einer Abfrage möchte ich die Datensätze löschen, die wiederholt werden.
Wie geht das mit TSQL in SQL Server?
sql
tsql
duplicates
delete-row
usr021986
quelle
quelle
empId
Spalte in Ihrem Beispiel von John verwendet?row_number() over (partition by EmployeeName order by EmployeeName)
... dies würde einen beliebigen einzelnen Datensatz für jeden Namen auswählen .Antworten:
Sie können dies mit Fensterfunktionen tun. Die Dupes werden nach empId sortiert und alle bis auf den ersten gelöscht.
Führen Sie es als Auswahl aus, um zu sehen, was gelöscht werden soll:
quelle
ORDER BY (SELECT NULL)
stackoverflow.com/a/4812038Angenommen, Ihre Mitarbeitertabelle verfügt auch über eine eindeutige Spalte (
ID
im folgenden Beispiel), funktioniert Folgendes:Dadurch bleibt die Version mit der niedrigsten ID in der Tabelle.
Bearbeiten
Sie den Kommentar von Re McGyver - ab SQL 2012
Für 2008 R2 und früher
Für 2008R2 müssen Sie das
GUID
in einen Typ umwandelnMIN
, der zSqlFiddle für verschiedene Typen in Sql 2008
SqlFiddle für verschiedene Typen in Sql 2012
quelle
Sie könnten Folgendes ausprobieren:
(Dies setzt voraus, dass Sie ein ganzzahliges eindeutiges Feld haben.)
Persönlich würde ich jedoch sagen, dass Sie besser dran sind, die Tatsache zu korrigieren, dass doppelte Einträge zur Datenbank hinzugefügt werden, bevor sie auftreten, als als Post-Fix-It-Operation.
quelle
quelle
Die Magie gängiger Tabellenausdrücke.
quelle
Versuchen
quelle
Wenn Sie nach einer Möglichkeit suchen, Duplikate zu entfernen, aber ein Fremdschlüssel auf die Tabelle mit Duplikaten zeigt, können Sie den folgenden Ansatz mit einem langsamen, aber effektiven Cursor wählen.
Die doppelten Schlüssel in der Fremdschlüsseltabelle werden verschoben.
quelle
quelle
Bitte beachten Sie auch die unten stehende Art der Löschung.
Erstellt eine Beispieltabelle mit dem Namen
@Employee
und lädt sie mit den angegebenen Daten.Ergebnis:
Ich weiß, das wird vor sechs Jahren gefragt, nur für den Fall, dass es für irgendjemanden hilfreich ist.
quelle
Hier ist eine gute Möglichkeit, Datensätze in einer Tabelle zu deduplizieren, deren Identitätsspalte auf einem gewünschten Primärschlüssel basiert, den Sie zur Laufzeit definieren können. Bevor ich anfange, fülle ich einen Beispieldatensatz mit dem folgenden Code auf:
Als nächstes werde ich einen Typ namens ColumnNames erstellen:
Schließlich werde ich einen gespeicherten Prozess mit den folgenden 3 Einschränkungen erstellen: 1. Der Prozess verwendet einen erforderlichen Parameter @tabellenname, der den Namen der Tabelle definiert, aus der Sie in Ihrer Datenbank löschen. 2. Der Prozess verfügt über einen optionalen Parameter @columns, mit dem Sie die Felder definieren können, aus denen der gewünschte Primärschlüssel besteht, für den Sie löschen. Wenn dieses Feld leer gelassen wird, wird davon ausgegangen, dass alle Felder außer der Identitätsspalte den gewünschten Primärschlüssel bilden. 3. Wenn doppelte Datensätze gelöscht werden, wird der Datensatz mit dem niedrigsten Wert in der Identitätsspalte beibehalten.
Hier ist mein delete_dupes gespeicherter Prozess:
Sobald dies erfüllt ist, können Sie alle Ihre doppelten Datensätze löschen, indem Sie den Prozess ausführen. Verwenden Sie diesen Aufruf, um Dupes zu löschen, ohne einen gewünschten Primärschlüssel zu definieren:
Verwenden Sie diesen Aufruf, um Dupes basierend auf einem definierten gewünschten Primärschlüssel zu löschen:
quelle