Brug 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 )
Selvfølgelig kunne du gøre a.rowid < b.rowid såvel. rowid er kun den fysiske adresse på rækken, så det er ligegyldigt, om du sletter rækken, der har den større eller den mindre adresse.
Dine forventede resultater giver dog ikke mening.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum af et resultatsæt tildeles altid på forespørgselstidspunktet. Det betyder, at en bestemt række kan vises med et andet rownum værdier i forskellige forespørgsler (eller når den samme forespørgsel køres flere gange). rownum er altid sekventiel, så du kan aldrig have et rownum af 4 i et resultatsæt uden også at have rownum værdier på 1, 2 og 3 i samme resultatsæt. Uanset hvilken dubletrække du sletter, vil dit resultat være
Forventet resultat:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Men rownum værdier er vilkårlige. Det ville være lige så gyldigt for Oracle at vende tilbage
Forventet resultat:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1