Як видаляти повторювані записи в Oracle
Повторювані рядки в Oracle можуть бути диференційовані тільки за допомогою їх `RowId` (адреса рядка).
Кроки
1
Видаліть рядок за допомогою rowid. Це найпростіший спосіб видалення запису.SQL SELECT ROWID,name FROM names-ROWID NAME------------------ -----------------------------;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-ROWID NAME------------------ -------------------;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-ROWID NAME------------------ -----------------------------;AABJnsAAGAAAdfOAAA AlanAABJnsAAGAAAdfOAAB AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD TomAABJnsAAGAAAdfOAAF Alan5 ROWS selected.SQL DELETE FROM names a2WHERE ROWID (SELECT MIN(ROWID) FROM names b3 WHERE b.name=a.name4)-2 ROWS deleted.SQL SELECT ROWID,name FROM names-ROWID NAME------------------ -----------------------------;AABJnsAAGAAAdfOAAA AlanAABJnsAAGAAAdfOAAC CarrieAABJnsAAGAAAdfOAAD Tom3 ROWS selected.SQL COMMIT-COMMIT complete.}}ulli<</span>liПродублюйте лінію 3 зверху і додайте нову назву стовпця, якщо у вас є декілька стовпців в таблиці. Припустимо, що у вас є стовпець віків, то команда буде наступною. <</span>brbr[[Image:DELETE Duplicate Records IN Oracle Step 4.jpg|center|550px]]ul{{CodeBox|<</span>source lang="Oracle8"SQL SELECT * FROM names-NAME AGE------------------------------ ---------;Alan 50Carrie 51Tom52Alan 504 ROWS selected.SQL DELETE FROM names a2WHERE ROWID (SELECT MIN(ROWID) FROM names b3 WHERE b.name=a.name4 AND b.age=a.age5)-1 ROW deleted.SQL SELECT * FROM names-NAME AGE------------------------------ ---------;Alan 50Carrie 51Tom52ROWS selected.SQL COMMIT-COMMIT complete.
Попередження
- Створіть резервну копію таблиці, щоб порівняти і показати зміст таблиці до видалення чого-небудь (якщо виникнуть питання).
SQL CREATE TABLE alan.names_backup AS SELECT * FROM names-TABLE created.