sql >> Databasteknik >  >> RDS >> Oracle

dubbletter av poster måste radera oracle db

Raderna är identiska förutom deras ID och tidsstämpel för skapande. För att hitta dubbletter måste du jämföra alla andra kolumner:

Frågan, hittar båda raderna genom att leta efter dubbletter med ett annat 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 ...
);

Delete-satsen behåller bara en rad i en grupp av dubbletter genom att jämföra 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 ...
);

Om du vill begränsa detta till ett visst datum och klockslag, gör det.

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

Du har alltså bara att göra med en del av tabellen, men du måste se till att DBMS kan hitta dessa data snabbt (och inte behöva läsa håltabellen om och om igen). Ange ett index för detta:

create index idx1 on hourly_report_table (api_date, api_hour);



  1. MySQL tät rankning för varje grupp/partition

  2. Bästa tillvägagångssätt för Microsoft SQL Server-katastrofåterställning

  3. Postgresql-index på xpath-uttryck ger ingen hastighet

  4. fråga efter postgres db med nod-postgres