Як видаляти повторювані записи в oracle
Повторювані рядки в Oracle можуть бути диференційовані тільки за допомогою їх `RowId` (адреса рядка).
кроки
1. Видаліть рядок за допомогою rowid. Це найпростіший спосіб видалення запису.
SQL> select rowid, name from names-ROWIDNAME ------------------ ---------------------- -------- AABJnsAAGAAAdfOAAA AlanAABJnsAAGAAAdfOAAB AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD Tom4 rows selected.SQL> delete from names where rowid = `AABJnsAAGAAAdfOAAA`-1 row deleted.SQL> commit-Commit complete.SQL> select rowid, name from names-ROWIDNAME ------------------ -------------------- AABJnsAAGAAAdfOAAB AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD Tom3 rows selected.
2. Видаліть всі повторювані рядки, крім однієї.
SQL> select name from names-NAME ------------------------------ AlanCarrieTomAlan4 rows selected.SQL> delete from names where name = `Alan`-2 rows deleted.SQL> commit-Commit complete.SQL> insert into names values (`Alan`) - 1 row created.SQL> commit-Commit complete.SQL> select * from names-NAME ------------------------------ AlanCarrieTomrows selected.
3. Використовуйте функцію max або min на rowed і видаліть всі інші рядки. В цьому випадку, якщо існують кілька дублікатів, вони будуть видалені.
SQL> select rowid, name from names-ROWIDNAME ------------------ ---------------------- -------- AABJnsAAGAAAdfOAAA AlanAABJnsAAGAAAdfOAAB AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD TomAABJnsAAGAAAdfOAAF Alan5 rows selected.SQL> delete from names a2where rowid> (select min (rowid) from names b3where b.name = a.name4) -2 rows deleted.SQL> select rowid, name from names-ROWIDNAME ------------------ ---------------------- -------- AABJnsAAGAAAdfOAAA AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD Tom3 rows selected.SQL> commit-Commit complete.}}
[[Image: Delete Duplicate Records in Oracle Step 4.jpg | center | 550px]] {{CodeBox | lang = "oracle8"> SQL> select * from names-NAMEAGE ------------------------------ ------ ---- Alan50Carrie51Tom52Alan504 rows selected.SQL> delete from names a2where rowid> (select min (rowid) from names b3where b.name = a.name4and b.age = a.age5) -1 row deleted.SQL> select * from names-NAMEAGE ------------------------------ ---------- Alan50Carrie51Tom52rows selected.SQL> commit-Commit complete.
попередження
- Створіть резервну копію таблиці, щоб порівняти і показати вміст таблиці до видалення чого-небудь (якщо виникнуть питання).
SQL> create table alan.names_backup as select * from names-Table created.