Ich teste etwas in Oracle und fülle eine Tabelle mit einigen Beispieldaten, aber dabei habe ich versehentlich doppelte Datensätze geladen, sodass ich jetzt mit einigen Spalten keinen Primärschlüssel erstellen kann.
Wie kann ich alle doppelten Zeilen löschen und nur eine davon belassen?
sql
oracle
duplicates
delete-row
Juan
quelle
quelle
Von Ask Tom
(Die fehlende Klammer wurde behoben)
quelle
Von DevX.com :
Wobei Spalte1, Spalte2 usw. der Schlüssel ist, den Sie verwenden möchten.
quelle
quelle
Lösung 1)
Lösung 2)
Lösung 3)
quelle
Erstellen Sie die Tabelle t2 als Auswahl, die * von t1 unterscheidet.
quelle
distinct *
nimmt jeden Datensatz, der sich in mindestens 1 Symbol in 1 Spalte unterscheidet. Sie müssen lediglich unterschiedliche Werte aus Spalten auswählen, für die Sie Primärschlüssel erstellen möchten. Bills Antwort ist ein hervorragendes Beispiel für diesen Ansatz.Sie sollten einen kleinen pl / sql-Block mit einem Cursor für die Schleife ausführen und die Zeilen löschen, die Sie nicht behalten möchten. Zum Beispiel:
quelle
Um die Duplikate auszuwählen, kann nur das Abfrageformat sein:
Die richtige Abfrage gemäß anderem Vorschlag lautet also:
Diese Abfrage speichert den ältesten Datensatz in der Datenbank für die in der
WHERE CLAUSE
.Oracle Certified Associate (2008)
quelle
Der schnellste Weg für wirklich große Tische
Erstellen Sie eine Ausnahmetabelle mit der folgenden Struktur: exception_table
Versuchen Sie, eine eindeutige Einschränkung oder einen Primärschlüssel zu erstellen, gegen die die Duplikate verstoßen. Sie erhalten eine Fehlermeldung, weil Sie Duplikate haben. Die Ausnahmetabelle enthält die Zeilen-IDs für die doppelten Zeilen.
Verbinden Sie Ihre Tabelle mit Ausnahmen_Tabelle nach Zeilen-ID und löschen Sie Dups
Wenn die Anzahl der zu löschenden Zeilen groß ist, erstellen Sie eine neue Tabelle (mit allen Berechtigungen und Indizes), die mit Ausnahmen_Tabelle nach Zeilen-ID nicht verknüpft ist, und benennen Sie die ursprüngliche Tabelle in die Tabelle original_dups um und benennen Sie die Tabelle new_table_with_no_dups in die ursprüngliche Tabelle um
quelle
Verwenden von rowid-
Verwenden von Self Join-
quelle
Lösung 4)
quelle
1. Lösung
2. Sloution
3.Lösung
4. Lösung
quelle
5. Lösung
quelle
Sie können doppelte Datensätze auch auf andere Weise löschen
quelle
quelle
quelle
quelle
Für die beste Leistung habe ich Folgendes geschrieben:
(siehe Ausführungsplan)
quelle
Überprüfen Sie die folgenden Skripte -
1.
2.
3.
Sie sehen hier 6 Datensätze.
4. Führen Sie die folgende Abfrage aus -
select * from test;
Sie werden sehen, dass doppelte Datensätze gelöscht wurden.
Hoffe das löst deine Frage. Vielen Dank :)
quelle
Ich habe keine Antworten gesehen, die allgemeine Tabellenausdrücke und Fensterfunktionen verwenden. Dies ist das, womit ich am einfachsten arbeiten kann.
Zu beachten:
1) Wir prüfen nur, ob die Felder in der Partitionsklausel doppelt vorhanden sind.
2) Wenn Sie einen Grund haben, ein Duplikat gegenüber anderen auszuwählen, können Sie eine order by-Klausel verwenden, damit diese Zeile row_number () = 1 hat
3) Sie können das beibehaltene Nummernduplikat ändern, indem Sie die letzte where-Klausel in "Where RN> N" mit N> = 1 ändern (ich dachte, N = 0 würde alle Zeilen mit Duplikaten löschen, aber nur alle Zeilen) .
4) Dem Feld Summenpartition wurde die CTE-Abfrage hinzugefügt, die jede Zeile mit den Zahlenzeilen in der Gruppe kennzeichnet. Um also Zeilen mit Duplikaten auszuwählen, einschließlich des ersten Elements, verwenden Sie "WHERE cnt> 1".
quelle
quelle
Lösung:
quelle