Oracle
 sql >> Base de données >  >> RDS >> Oracle

les enregistrements en double doivent supprimer oracle db

Les lignes sont identiques à l'exception de leur ID et de l'horodatage de création. Afin de trouver des doublons, vous devez comparer toutes les autres colonnes :

La requête, trouvant les deux lignes en recherchant les doublons avec un autre ID (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 ...
);

L'instruction de suppression ne conservant qu'une seule ligne d'un groupe de doublons en comparant t2.id < t1.id :

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 ...
);

Si vous souhaitez limiter cela à une date et une heure particulières, faites-le.

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

Ainsi, vous ne traitez qu'une partie de la table, mais vous devez vous assurer que le SGBD peut trouver ces données rapidement (et ne pas avoir à relire la table des trous encore et encore). Fournissez un index pour ceci :

create index idx1 on hourly_report_table (api_date, api_hour);