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