Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Löschen Sie doppelte Zeilen aus Oracle

Aus vielen Gründen in der Datenbank müssen wir häufig doppelte Zeilen aus der Oracle-Tabelle finden und löschen. Wir müssen häufig löschen, um die Datenprobleme zu beseitigen. Es gibt viele Möglichkeiten, doppelte Zeilen mit Oracle zu löschen, aber das Original zu behalten. Ich würde in diesem Beitrag einige schnellere Methoden vorstellen, um dies zu erreichen. Ich werde die Methode zeigen, bei der rowid verwendet wird, und die Methode, bei der rowid nicht verwendet wird. Bitte beachten Sie, dass Sie alle Spalten identifizieren müssen, die die Zeile zu einem Duplikat in der Tabelle machen, und alle diese Spalten in der entsprechenden Löschanweisung in SQL angeben müssen

So löschen Sie doppelte Zeilen aus Oracle

Hier sind einige Möglichkeiten, doppelte Zeilen auf einfache Weise zu löschen

(A) Schnelle Methode, aber Sie müssen alle Oracle-Indizes und -Trigger neu erstellen

create table my_table1 as select distinct * from my_table;
drop my_table;
rename my_table1 to my_table;

Beispiel

SQL> select * from mytest;
ID NAME
------
1 TST 
2 TST 
1 TST

SQL> create table mytest1 as select distinct * from mytest;
Table created.

SQL> select * from mytest1;
ID NAME
-------
2 TST 
1 TST
SQL> drop table mytest;
Table dropped.
SQL> rename mytest1 to mytest;
Table renamed.
SQL> select * from mytest;
ID NAME
-------
2 TST
1 TST

(B) So finden und löschen Sie doppelte Datensätze in Oracle mithilfe von Rowid. Das folgende Beispiel zeigt eine Spalte. Wenn Sie basierend auf zwei Spalten löschen, können Sie zwei Spalten angeben

Delete from my_table where rowid not in (
select max(rowid) from my_table group by my_col_name );

(C)   Orakel-Self-Join verwenden, um doppelte Zeilen zu löschen

DELETE FROM my_table A WHERE ROWID > (SELECT min(rowid) FROM my_table B WHERE A.key_values = B.key_values);

(D) Existiert-Klausel verwenden

delete from my_table t1
where exists (select 'x' from my_table t2
where t2.key_value1 = t1.key_value1
and t2.key_value2 = t1.key_value2
and t2.rowid > t1.rowid);

(E) Löschen Sie doppelte Datensätze bei der Verwendung von Oracle-Analysefunktionen

delete from my_table
where rowid in
(select rid
from
( select
rowid rid,
row_number() over (partition by column_name order by rowid) rn
from my_table)
where rn <> 1
)

Wie gezeigt, gibt es viele Möglichkeiten, doppelte Zeilen in den Tabellen zu löschen. Dieser Befehl kann in vielen Situationen nützlich sein und kann je nach Anforderung verwendet werden. Bitte stellen Sie immer sicher, dass wir eine Sicherung zur Verfügung haben, bevor Sie irgendwelche Anweisungen ausführen. Wir sollten auch zuerst das Duplikat mithilfe der Abfrage finden und es dann überprüfen, bevor wir es festschreiben

Wie man doppelte Datensätze in Oracle mit Rowid findet

select * from my_table
where rowid not in
(select max(rowid) from my_table group by column_name);

Suchen Sie also zuerst das Duplikat mit der obigen Abfrage und löschen Sie es dann. Die Anzahl der Löschvorgänge sollte mit der Zeilenanzahl der obigen Abfrage übereinstimmen. Führen Sie jetzt die Abfrage zum Suchen von Duplikaten erneut aus. Wenn kein Duplikat vorhanden ist, sind wir gut für die Übergabe

Bitte sehen Sie sich den folgenden Artikel an, um  tief in SQL einzutauchen

Oracle SQL-Tutorials:Enthält die Liste aller nützlichen Oracle SQL-Artikel. Erkunden Sie sie, um mehr über Oracle Sql zu erfahren, selbst wenn Sie Oracle Sql kennen
Fragen zu Oracle-Interviews:Auf dieser Seite finden Sie die 49 häufigsten Fragen und Antworten zu Oracle-Interviews:Grundlagen, Oracle SQL, das Ihnen bei Vorstellungsgesprächen hilft. Zusätzliches Material wird ebenfalls bereitgestellt
Where-Klausel in Oracle :Einschränkung des Datensatzes, Where-Klausel, What is Where-Klausel in SQL-Anweisung, Einzelzeilenfunktionen des Vergleichsoperators
in Oracle :Sehen Sie sich dies an, um Einzelzeilenfunktionen in SQL, Oracle-Daten herauszufinden Funktionen, Numerische Funktionen in SQL, Zeichenfunktion in SQL
Oracle-SQL-Abfragen
blog.oracle.com