Da die Unternehmensdaten immer weiter wachsen, sind doppelte Daten zu einem wichtigen Problem bei der Datenbankverwaltung geworden. In Oracle-Datenbanken führen doppelte Daten zu ungenauen Abfrageergebnissen, verbrauchen Speicherplatz und beeinträchtigen die Datenbankleistung. Daher ist eine Deduplizierung erforderlich.
In diesem Artikel werden verschiedene Methoden zum Löschen doppelter Daten in der Oracle-Datenbank vorgestellt.
Methode 1: Unterabfragen und Gruppierung verwenden
Bevor wir doppelte Daten löschen, müssen wir zunächst verstehen, was doppelte Daten sind. In einer Oracle-Datenbank sind zwei oder mehr Datensätze Duplikate, wenn sie alle dieselben Spalten haben.
Das Folgende ist eine Beispieltabelle mit doppelten Daten:
CREATE TABLE employee( emp_id NUMBER(6), first_name VARCHAR2(50), last_name VARCHAR2(50), dept_id NUMBER(4) ); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(1, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(2, 'Jane', 'Doe', 102); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(3, 'John', 'Doe', 101); INSERT INTO employee(emp_id, first_name, last_name, dept_id) VALUES(4, 'Bob', 'Smith', 103);
Wenn wir doppelte Daten entfernen und nur einen Datensatz für jeden Mitarbeiter behalten möchten, können wir die folgende SQL-Abfrageanweisung verwenden:
DELETE FROM employee WHERE emp_id IN (SELECT emp_id FROM (SELECT emp_id, ROW_NUMBER() OVER (PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee) WHERE rn <> 1);
Diese SQL-Anweisung verwendet eine Unterabfrage , verwendet diese Unterabfrage die Funktion ROW_NUMBER, um die erste Zeile jedes Mitarbeiters zu identifizieren. Anschließend werden alle verbleibenden Zeilen gelöscht. Die PARTITION BY-Anweisung wird verwendet, um Zeilen in jeder Abteilung zu gruppieren, und die ORDER BY-Anweisung sortiert Zeilen in emp_id-Reihenfolge. Nachdem wir die Funktion ROW_NUMBER ausgeführt haben, erhalten wir das folgende Ergebnis:
EMP_ID | FIRST_NAME | LAST_NAME | DEPT_ID | RN -------|------------|-----------|---------|----- 1 | John | Doe | 101 | 1 2 | Jane | Doe | 102 | 1 3 | John | Doe | 101 | 2 4 | Bob | Smith | 103 | 1
Hier können wir sehen, dass John Doe in derselben Abteilung an der 1. und 3. Position steht, was bedeutet, dass es zwei John Doe-Datensätze gibt. Indem wir alle Zeilen entfernen, in denen rn ungleich 1 ist, können wir doppelte Daten entfernen und für jeden Mitarbeiter eine Zeile behalten.
Methode 2: Verwenden Sie eine temporäre Tabelle
Eine andere Methode besteht darin, eine temporäre Tabelle zu verwenden, in der die Daten gespeichert werden, die wir aufbewahren müssen. Wir können die folgende SQL-Abfrageanweisung verwenden:
CREATE TABLE temp_employee AS SELECT DISTINCT emp_id, first_name, last_name, dept_id FROM employee;
Diese Anweisung wählt die eindeutige emp_id, first_name, last_name und dept_id aus der Mitarbeitertabelle aus und fügt sie in eine neue Tabelle namens temp_employee ein.
Jetzt können wir alle Zeilen aus der Mitarbeitertabelle löschen und die Zeilen aus der temp_employee-Tabelle zurück in die Mitarbeitertabelle verschieben, indem wir die folgende SQL-Anweisung verwenden:
DELETE FROM employee; INSERT INTO employee(emp_id, first_name, last_name, dept_id) SELECT emp_id, first_name, last_name, dept_id FROM temp_employee;
Dadurch werden alle Zeilen aus der Mitarbeitertabelle gelöscht und die Zeilen aus verschoben Die temp_employee-Tabelle In die Mitarbeitertabelle einfügen. Jetzt haben wir alle doppelten Datensätze entfernt und für jeden Mitarbeiter eine Zeile beibehalten.
Methode 3: Verwenden der CTE- und ROW_NUMBER-Funktion
Dies ist eine weitere Methode, die die ROW_NUMBER-Funktion verwendet, aber einen gemeinsamen Ausdruck (CTE) verwendet. Die folgende SQL-Abfrageanweisung kann verwendet werden, um doppelte Daten zu entfernen:
WITH emp AS( SELECT emp_id, first_name, last_name, dept_id, ROW_NUMBER() OVER(PARTITION BY first_name, last_name, dept_id ORDER BY emp_id) rn FROM employee ) DELETE FROM emp WHERE rn > 1;
Diese Anweisung verwendet den allgemeinen Ausdruck emp, der alle Datensätze enthält, die wir löschen müssen, und den ersten Datensatz in jeder Gruppe identifiziert. Anschließend verwendet es die DELETE-Anweisung, um die verbleibenden Zeilen in allen Gruppen zu löschen.
Fazit
In Oracle-Datenbanken ist es sehr wichtig, doppelte Daten zu entfernen. Doppelte Daten beeinträchtigen die Datenbankleistung, verschwenden Speicherplatz und führen zu ungenauen Abfrageergebnissen. In diesem Artikel werden verschiedene Möglichkeiten zum Entfernen doppelter Daten erläutert, darunter die Verwendung von Unterabfragen und Gruppierungen, die Verwendung temporärer Tabellen sowie die Verwendung der Funktionen CTE und ROW_NUMBER. Unabhängig davon, für welche Methode Sie sich entscheiden, sichern Sie für alle Fälle unbedingt Ihre Daten, bevor Sie Datensätze löschen.
Das obige ist der detaillierte Inhalt vonOracle-Datendeduplizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!