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

Xóa tất cả các bản ghi ngoại trừ bản ghi gần đây nhất?

DELETE FROM student
WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime) 
                              FROM student s2
                              WHERE s2.StudentID  = student.StudentID)

Với cuộc thảo luận dài trong các bình luận, vui lòng lưu ý những điều sau:

Tuyên bố trên sẽ làm việc trên bất kỳ cơ sở dữ liệu nào triển khai đúng mức độ nhất quán đọc của câu lệnh bất kể bất kỳ thay đổi nào đối với bảng trong khi câu lệnh đang chạy.

Cơ sở dữ liệu mà tôi chắc chắn biết rằng điều này hoạt động chính xác ngay cả với các sửa đổi đồng thời đối với bảng:Oracle (cái mà câu hỏi này là về), Postgres, SAP HANA, Firebird (và có lẽ là MySQL sử dụng InnoDB). Bởi vì tất cả chúng đều đảm bảo một cái nhìn nhất quán về dữ liệu tại thời điểm khi câu lệnh bắt đầu. Thay đổi <> thành < sẽ không thay đổi bất cứ điều gì đối với họ (kể cả Oracle mà câu hỏi này là về)

Đối với các cơ sở dữ liệu được đề cập ở trên, tuyên bố không tùy thuộc vào mức cô lập vì đọc ảo hoặc đọc không lặp lại chỉ có thể xảy ra giữa nhiều tuyên bố - không nằm trong một đơn vị tuyên bố.

Đối với cơ sở dữ liệu không triển khai MVCC đúng cách và dựa vào khóa để quản lý đồng thời (do đó chặn truy cập ghi đồng thời), điều này thực sự có thể mang lại kết quả sai nếu bảng được cập nhật đồng thời. Đối với những người, giải pháp thay thế bằng cách sử dụng < có lẽ là cần thiết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khắc phục sự cố với Oracle Trigger để tạo id từ một chuỗi

  2. Định dạng một số dưới dạng phần trăm trong Oracle

  3. Làm cách nào để chọn tất cả các cột từ bảng, cùng với các cột bổ sung như ROWNUM?

  4. Kiểm tra xem hai lựa chọn có tương đương nhau không

  5. truyền động tên bảng và cột bằng cách sử dụng các biến liên kết