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

Xóa các bản ghi trùng lặp bằng rownum trong sql

Sử dụng rowid

DELETE FROM table_name a
 WHERE EXISTS( SELECT 1
                 FROM table_name b
                WHERE a.id = b.id
                  AND a.name = b.name
                  AND a.rowid > b.rowid )

Tất nhiên, bạn có thể làm a.rowid < b.rowid cũng. rowid chỉ là địa chỉ vật lý của hàng nên việc bạn xóa hàng có địa chỉ lớn hơn hay nhỏ hơn không quan trọng.

Tuy nhiên, kết quả mong đợi của bạn không có ý nghĩa.

Expected Result :

        ROWNUM         ID NAME
    ---------- ---------- ----------
             4          1 leo_1
             5          2 leo_2
             6          3 leo_3

rownum của một tập hợp kết quả luôn được chỉ định tại thời điểm truy vấn. Điều đó có nghĩa là một hàng cụ thể có thể xuất hiện với rownum khác nhau giá trị trong các truy vấn khác nhau (hoặc khi cùng một truy vấn được chạy nhiều lần). rownum luôn tuần tự vì vậy bạn không bao giờ có thể có rownum 4 trong một tập hợp kết quả mà không có rownum các giá trị 1, 2 và 3 trong cùng một tập kết quả. Cho dù bạn xóa hàng trùng lặp nào, kết quả của bạn sẽ là

Kết quả mong đợi:

    ROWNUM         ID NAME
---------- ---------- ----------
         1          1 leo_1
         2          2 leo_2
         3          3 leo_3

Nhưng rownum giá trị là tùy ý. Việc trả về của Oracle cũng hợp lệ như vậy

Kết quả mong đợi:

    ROWNUM         ID NAME
---------- ---------- ----------
         1          2 leo_2
         2          3 leo_3
         3          1 leo_1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao sqlplus không kết nối?

  2. Chèn ngày vào cơ sở dữ liệu oracle từ PHP

  3. Câu lệnh FORALL với giới hạn dưới và trên trong cơ sở dữ liệu Oracle

  4. ORA-24247 khi gửi qua FTP

  5. Chuyển đổi một truy vấn tiên tri thành truy vấn MySQL