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