Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

bản ghi trùng lặp cần xóa oracle db

Các hàng giống hệt nhau ngoại trừ ID và dấu thời gian tạo của chúng. Để tìm các bản sao, bạn phải so sánh tất cả các cột khác:

Truy vấn, tìm cả hai hàng bằng cách tìm các bản sao có ID khác (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 ...
);

Câu lệnh xóa chỉ giữ một hàng của một nhóm các bản sao bằng cách so sánh 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 ...
);

Nếu bạn muốn giới hạn điều này trong một ngày và giờ cụ thể, hãy làm như vậy.

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

Vì vậy, bạn chỉ xử lý một phần của bảng, nhưng bạn phải đảm bảo rằng DBMS có thể tìm thấy dữ liệu này một cách nhanh chóng (và không phải đọc lại bảng lỗ). Cung cấp chỉ mục cho việc này:

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. Trailing Zero

  2. Có một Bảng Oracle được đặt tên là Từ dành riêng, Những vấn đề nào có thể phát sinh?

  3. Oracle:Chọn ngày giữa các phạm vi ngày bằng SQL

  4. Oracle xử lý các lệnh gọi hàm được lưu trữ trong SQL như thế nào?

  5. Điền các giá trị vào một Danh sách thả xuống dựa trên một lựa chọn Thả xuống khác bằng cách sử dụng JSTL