Utilisez le 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 )
Bien sûr, vous pouvez faire a.rowid < b.rowid
aussi bien. Le rowid
est juste l'adresse physique de la ligne donc peu importe que vous supprimiez la ligne qui a la plus grande ou la plus petite adresse.
Vos résultats attendus, cependant, n'ont aucun sens.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
Le rownum
d'un ensemble de résultats est toujours affecté au moment de la requête. Cela signifie qu'une ligne particulière peut apparaître avec différents rownum
valeurs dans différentes requêtes (ou lorsque la même requête est exécutée plusieurs fois). rownum
est toujours séquentiel donc vous ne pouvez jamais avoir un rownum
de 4 dans un jeu de résultats sans avoir également rownum
valeurs de 1, 2 et 3 dans le même jeu de résultats. Quelle que soit la ligne en double que vous supprimez, votre résultat sera
Résultat attendu :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Mais le rownum
les valeurs sont arbitraires. Il serait tout aussi valable pour Oracle de retourner
Résultat attendu :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1