Gunakan 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 )
Tentu saja, Anda dapat melakukan a.rowid < b.rowid demikian juga. rowid hanyalah alamat fisik baris sehingga tidak masalah apakah Anda menghapus baris yang memiliki alamat lebih besar atau lebih kecil.
Namun, hasil yang Anda harapkan tidak masuk akal.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum dari kumpulan hasil selalu ditetapkan pada waktu kueri. Itu berarti bahwa baris tertentu mungkin muncul dengan rownum yang berbeda nilai dalam kueri yang berbeda (atau saat kueri yang sama dijalankan beberapa kali). rownum selalu berurutan sehingga Anda tidak akan pernah memiliki rownum dari 4 dalam set hasil tanpa juga memiliki rownum nilai 1, 2, dan 3 dalam kumpulan hasil yang sama. Baris duplikat mana pun yang Anda hapus, hasilnya adalah
Hasil yang Diharapkan :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Tapi rownum nilai bersifat arbitrer. Oracle akan sama validnya untuk kembali
Hasil yang Diharapkan :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1