Използвайте 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 )
Разбира се, можете да направите a.rowid < b.rowid
както добре. rowid
е само физическият адрес на реда, така че няма значение дали ще изтриете реда, който има по-големия или по-малкия адрес.
Очакваните от вас резултати обаче нямат смисъл.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum
на набор от резултати винаги се присвоява по време на заявка. Това означава, че определен ред може да се появи с различен rownum
стойности в различни заявки (или когато една и съща заявка се изпълнява няколко пъти). rownum
винаги е последователен, така че никога не можете да имате rownum
от 4 в набор от резултати, без също да има rownum
стойности от 1, 2 и 3 в един и същ набор от резултати. Който и дублиран ред да изтриете, резултатът ще бъде
Очакван резултат:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Но rownum
стойностите са произволни. Би било също толкова валидно Oracle да се върне
Очакван резултат:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1