sql >> Database >  >> RDS >> Oracle

dubbele records moeten oracle db verwijderen

De rijen zijn identiek, behalve hun ID en aanmaaktijdstempel. Om duplicaten te vinden, moet u alle andere kolommen vergelijken:

De zoekopdracht, beide rijen vinden door te zoeken naar duplicaten met een andere 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 ...
);

De delete-instructie behoudt slechts één rij van een groep duplicaten door t2.id < t1.id te vergelijken :

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

Als je dit wilt beperken tot een bepaalde datum en uur, doe dat dan.

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

U heeft dus maar met een deel van de tabel te maken, maar u moet er wel voor zorgen dat het DBMS deze gegevens snel kan vinden (en de gatentabel niet steeds opnieuw te moeten lezen). Geef hiervoor een index op:

create index idx1 on hourly_report_table (api_date, api_hour);



  1. LAST_INSERT_ID() is ongelijk aan $db->insert_id?

  2. Fysieke replicatiemechanismen in PostgreSQL

  3. Hoe MYSQL db in PHP te transponeren

  4. Hoe gebruik je een tekenreeks/kolomwaarde als mysql-datumintervalconstante (DAG, MAAND...)?