Oracle
 sql >> база данни >  >> RDS >> Oracle

дублиращите се записи трябва да изтрият oracle db

Редовете са идентични, с изключение на техния идентификатор и време на създаване. За да намерите дубликати, трябва да сравните всички други колони:

Заявката, намираща и двата реда чрез търсене на дубликати с друг идентификатор (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 ...
);

Операторът за изтриване запазва само един ред от група дубликати чрез сравняване на 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 ...
);

Ако искате да ограничите това до определена дата и час, направете го.

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

Така вие работите само с част от таблицата, но трябва да сте сигурни, че СУБД може да намери тези данни бързо (и да не се налага да четете таблицата с дупки отново и отново). Предоставете индекс за това:

create index idx1 on hourly_report_table (api_date, api_hour);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Форматът на DATE по подразбиране на Oracle

  2. Codeigniter и oracle недефинирана константа:OCI_COMMIT_ON_SUCCESS

  3. Как да намерите текущи отворени курсори в Oracle

  4. Oracle NUMBER(p) размер на хранилището?

  5. Как да създадете процедура в Oracle SQL Developer?