Wie kann ich doppelte Zeilen löschen, wenn keine unique row id
vorhanden sind?
Mein Tisch ist
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Ich möchte nach dem Entfernen des Duplikats Folgendes haben:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Ich habe einige Abfragen ausprobiert, aber ich denke, sie hängen von einer Zeilen-ID ab, da ich nicht das gewünschte Ergebnis erhalte. Zum Beispiel:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
quelle
quelle
Antworten:
Ich mag CTEs und
ROW_NUMBER
da wir beide zusammen sehen können, welche Zeilen gelöscht (oder aktualisiert) werden, ändern Sie einfach FolgendesDELETE FROM CTE...
inSELECT * FROM CTE
:DEMO (Ergebnis ist anders; ich gehe davon aus, dass es an einem Tippfehler von Ihrer Seite liegt)
In diesem Beispiel werden Duplikate
col1
aufgrund derPARTITION BY col1
. Wenn Sie mehrere Spalten einfügen möchten, fügen Sie diese einfach hinzuPARTITION BY
:quelle
AND COl1='John'
). Normalerweise sollten Sie den Filter im CTE anwenden....FROM dbo.Table1 WHERE Col1='John'
. Hier ist die Geige: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
wie hierIch würde CTE bevorzugen, um doppelte Zeilen aus der SQL Server-Tabelle zu löschen
Es wird dringend empfohlen, diesem Artikel zu folgen: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
quelle
Ohne zu verwenden
CTE
undROW_NUMBER()
Sie können die Datensätze einfach löschen, indem Sie group by mitMAX
Funktion hier und Beispiel verwendenquelle
MIN(ID)
quelle
Bitte beachten Sie auch die unten stehende Art der Löschung.
Erstellt eine Beispieltabelle mit dem Namen
@table
und lädt sie mit den angegebenen Daten.Hinweis: Wenn Sie alle Spalten im
Partition by
Teil angeben, hatorder by
dies keine große Bedeutung.Ich weiß, die Frage wurde vor drei Jahren gestellt, und meine Antwort ist eine andere Version dessen, was Tim gepostet hat. Aber das Posten ist nur für den Fall hilfreich, dass es für jeden hilfreich ist.
quelle
Wenn Sie keine Referenzen wie Fremdschlüssel haben, können Sie dies tun. Ich mache es oft, wenn ich Proofs of Concept teste und die Testdaten dupliziert werden.
Gehen Sie in den Objekt-Explorer und löschen Sie die alte Tabelle.
Benennen Sie die neue Tabelle mit dem Namen der alten Tabelle um.
quelle
Microsoft hat eine sehr übersichtliche Anleitung zum Entfernen von Duplikaten. Überprüfen Sie http://support.microsoft.com/kb/139444
Kurz gesagt, hier ist der einfachste Weg, um Duplikate zu löschen, wenn Sie nur wenige Zeilen zum Löschen haben:
myprimarykey ist die Kennung für die Zeile.
Ich habe die Zeilenanzahl auf 1 gesetzt, weil ich nur zwei Zeilen hatte, die dupliziert wurden. Wenn ich 3 Zeilen dupliziert hätte, hätte ich die Zeilenanzahl auf 2 gesetzt, damit die ersten beiden Zeilen gelöscht werden und nur eine in Tabelle t1 verbleibt.
Hoffe es hilft jedem
quelle
Versuchen zu benutzen:
quelle
Nachdem Sie die oben vorgeschlagene Lösung ausprobiert haben, funktioniert dies für kleine mittlere Tabellen. Ich kann diese Lösung für sehr große Tabellen vorschlagen. da es in Iterationen läuft.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
erneut, aber fügen Sie jetzt einen Primärschlüssel mit allen Spalten hinzu, die das Hinzufügen von Duplikaten definierenWITH (IGNORE_DUP_KEY = ON)
Zum Beispiel:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Erstellen Sie erneut die Ansichten, die Sie an erster Stelle für die neu erstellte Tabelle gelöscht haben
Führen Sie nun das folgende SQL-Skript aus. Die Ergebnisse werden in 1.000.000 Zeilen pro Seite angezeigt. Sie können die Zeilennummer pro Seite ändern, um die Ergebnisse häufiger anzuzeigen.
Beachten Sie, dass ich das
IDENTITY_INSERT
Ein- und Ausschalten aktiviert habe, da eine der Spalten eine automatisch inkrementelle ID enthält, die ich auch kopiereSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
quelle
Es gibt zwei Lösungen in
mysql
:A) Löschen Sie doppelte Zeilen mit der
DELETE JOIN
AnweisungDiese Abfrage verweist zweimal auf die Kontakttabelle
t1
und verwendet daher den Tabellenalias undt2
.Die Ausgabe ist:
Wenn Sie doppelte Zeilen löschen und die beibehalten möchten
lowest id
, können Sie die folgende Anweisung verwenden:B) Löschen Sie doppelte Zeilen mithilfe einer Zwischentabelle
Im Folgenden werden die Schritte zum Entfernen doppelter Zeilen mithilfe einer Zwischentabelle aufgeführt:
1. Erstellen Sie eine neue Tabelle mit der gleichen Struktur wie die ursprüngliche Tabelle, in der Sie doppelte Zeilen löschen möchten.
2. Fügen Sie unterschiedliche Zeilen aus der Originaltabelle in die Soforttabelle ein.
3. Fügen Sie unterschiedliche Zeilen aus der ursprünglichen Tabelle in die unmittelbare Tabelle ein.
Schritt 1. Erstellen Sie eine neue Tabelle, deren Struktur mit der ursprünglichen Tabelle übereinstimmt:
Schritt 2. Fügen Sie unterschiedliche Zeilen aus der ursprünglichen Tabelle in die neue Tabelle ein:
Schritt 3. Löschen Sie die ursprüngliche Tabelle und benennen Sie die unmittelbare Tabelle in die ursprüngliche um
Quelle: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
quelle
quelle
Sie müssen nach den doppelten Datensätzen entsprechend den Feldern gruppieren, dann einen der Datensätze halten und den Rest löschen. Zum Beispiel:
quelle
Das Löschen von Duplikaten aus einer riesigen Tabelle (mehrere Millionen Datensätze) kann lange dauern. Ich schlage vor, dass Sie eine Masseneinfügung in eine temporäre Tabelle der ausgewählten Zeilen durchführen, anstatt sie zu löschen.
quelle
In SQL Server kann dies auf viele Arten erfolgen. Die einfachste Möglichkeit hierfür ist: Einfügen der einzelnen Zeilen aus der Tabelle der doppelten Zeilen in eine neue temporäre Tabelle. Löschen Sie dann alle Daten aus der Tabelle mit doppelten Zeilen und fügen Sie alle Daten aus der temporären Tabelle ein, die keine Duplikate enthält, wie unten gezeigt.
Löschen Sie doppelte Zeilen mit Common Table Expression (CTE).
quelle
quelle
Unter Bezugnahme auf https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
Die Idee, Duplikate zu entfernen, beinhaltet
Schritt für Schritt
quelle
Wenn Sie der Tabelle vorübergehend eine Spalte hinzufügen können, war dies eine Lösung, die für mich funktioniert hat:
Führen Sie dann ein LÖSCHEN mit einer Kombination aus MIN und GROUP BY durch
Stellen Sie sicher, dass DELETE ordnungsgemäß ausgeführt wurde:
Das Ergebnis sollte keine Zeilen mit einer Anzahl größer als 1 enthalten. Entfernen Sie schließlich die Zeilen-ID-Spalte:
quelle
Eine andere Möglichkeit, nicht veröffentlichte Zeilen zu entfernen, ohne Informationen in einem Schritt zu verlieren, ist wie folgt:
quelle
Oh wow, ich fühle mich so dumm, wenn ich all diese Antworten fertig habe. Sie sind wie die Antwort von Experten mit allen CTE- und temporären Tabellen usw.
Und alles, was ich getan habe, um es zum Laufen zu bringen, war einfach die ID-Spalte mit MAX zu aggregieren.
HINWEIS: Möglicherweise müssen Sie es mehrmals ausführen, um doppelte Zeilen zu entfernen, da dadurch jeweils nur ein Satz doppelter Zeilen gelöscht wird.
quelle
quelle
quelle