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を持つことはできません。 rownumも含まない結果セットの4 同じ結果セットの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