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