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

doppelte Datensätze müssen Oracle db löschen

Die Zeilen sind bis auf ihre ID und den Erstellungszeitstempel identisch. Um Duplikate zu finden, müssen Sie alle anderen Spalten vergleichen:

Die Abfrage, die beide Zeilen findet, indem nach Duplikaten mit einer anderen ID gesucht wird (t2.id <> t1.id ):

select *
from hourly_report_table t1
where exists
(
  select *
  from hourly_report_table t2
  where t2.id <> t1.id
  and t2.application = t1.application
  and t2.api_date = t1.api_date
  and t2.api_hour = t1.api_hour
  and ...
);

Die Löschanweisung behält nur eine Zeile einer Gruppe von Duplikaten bei, indem sie t2.id < t1.id vergleicht :

delete
from hourly_report_table t1
where exists
(
  select *
  from hourly_report_table t2
  where t2.id < t1.id
  and t2.application = t1.application
  and t2.api_date = t1.api_date
  and t2.api_hour = t1.api_hour
  and ...
);

Wenn Sie dies auf ein bestimmtes Datum und eine bestimmte Uhrzeit beschränken möchten, tun Sie dies.

where exists (...) and api_date = date '2020-09-27' and api_hour = 17

Sie haben es also nur mit einem Teil der Tabelle zu tun, müssen aber dafür sorgen, dass das DBMS diese Daten schnell finden kann (und die Lochtabelle nicht immer wieder neu lesen muss). Geben Sie dafür einen Index an:

create index idx1 on hourly_report_table (api_date, api_hour);