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