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