Użyj 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 )
Oczywiście możesz zrobić a.rowid < b.rowid
również. rowid
jest tylko fizycznym adresem wiersza, więc nie ma znaczenia, czy usuniesz wiersz, który ma większy czy mniejszy adres.
Twoje oczekiwane wyniki nie mają jednak sensu.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum
zestawu wyników jest zawsze przypisywana w czasie zapytania. Oznacza to, że określony wiersz może pojawić się z różnymi rownum
wartości w różnych zapytaniach (lub gdy to samo zapytanie jest uruchamiane wiele razy). rownum
jest zawsze sekwencyjny, więc nigdy nie możesz mieć rownum
z 4 w zestawie wyników bez również rownum
wartości 1, 2 i 3 w tym samym zestawie wyników. Niezależnie od tego, który zduplikowany wiersz usuniesz, wynikiem będzie
Oczekiwany wynik :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Ale rownum
wartości są arbitralne. Zwrot Oracle byłby równie ważny
Oczekiwany wynik :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1