173 votes

Suppression des lignes en double d'une table dans Oracle

Je suis en train de tester quelque chose dans Oracle et j'ai rempli une table avec quelques données échantillons, mais au cours du processus, j'ai accidentellement chargé des enregistrements en double, de sorte que je ne peux pas créer de clé primaire en utilisant certaines des colonnes.

Comment puis-je supprimer toutes les lignes en double et n'en laisser qu'une seule ?

7voto

Mohammed khaled Points 39

Créer la table t2 comme select distinct * from t1 ;

0 votes

Pas une réponse - distinct * prendra tous les enregistrements qui diffèrent par au moins un symbole dans une colonne. Tout ce dont vous avez besoin est de sélectionner des valeurs distinctes uniquement dans les colonnes dont vous voulez faire des clés primaires - la réponse de Bill est un excellent exemple de cette approche.

1 votes

C'est ce dont j'avais besoin (supprimer les lignes entièrement identiques). Merci !

0 votes

Un autre inconvénient de cette méthode est que vous devez créer une copie de votre tableau. Pour les tables volumineuses, cela implique de prévoir un tablespace supplémentaire, et de supprimer ou de réduire le tablespace après la copie. La méthode de Bill présente plus d'avantages, et aucun inconvénient supplémentaire.

3voto

Nick Points 1378

Vous devriez faire un petit bloc pl/sql en utilisant une boucle for curseur et supprimer les lignes que vous ne voulez pas garder. Par exemple :

declare
prev_var my_table.var1%TYPE;

begin

for t in (select var1 from my_table order by var 1) LOOP

-- if previous var equal current var, delete the row, else keep on going.
end loop;

end;

3voto

user1799846 Points 9

Pour sélectionner les doublons, seul le format de requête peut être utilisé :

SELECT GroupFunction(column1), GroupFunction(column2),..., 
COUNT(column1), column1, column2...
FROM our_table
GROUP BY column1, column2, column3...
HAVING COUNT(column1) > 1

Donc, la question correcte, selon les autres suggestions, est la suivante :

DELETE FROM tablename a
      WHERE a.ROWID > ANY (SELECT b.ROWID
                             FROM tablename b
                            WHERE a.fieldname = b.fieldname
                              AND a.fieldname2 = b.fieldname2
                              AND ....so on.. to identify the duplicate rows....)

Cette requête conservera l'enregistrement le plus ancien de la base de données pour les critères choisis dans la fenêtre de recherche. WHERE CLAUSE .

Associé certifié Oracle (2008)

3voto

Krunal Patel Points 29
create table abcd(id number(10),name varchar2(20))

insert into abcd values(1,'abc')

insert into abcd values(2,'pqr')

insert into abcd values(3,'xyz')

insert into abcd values(1,'abc')

insert into abcd values(2,'pqr')

insert into abcd values(3,'xyz')

select * from abcd
id  Name
1   abc
2   pqr
3   xyz
1   abc
2   pqr
3   xyz

Delete Duplicate record but keep Distinct Record in table 

DELETE 
FROM abcd a
WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b
WHERE b.id=a.id
);

run the above query 3 rows delete 

select * from abcd

id  Name 
1   abc
2   pqr
3   xyz

2voto

user2158672 Points 1

Le moyen le plus rapide pour les très grandes tables

  1. Créer une table d'exceptions avec la structure ci-dessous : exception_table

    ROW_ID ROWID
    OWNER VARCHAR2(30)
    TABLE_NAME VARCHAR2(30)
    CONSTRAINT VARCHAR2(30)
  2. Essayez de créer une contrainte unique ou une clé primaire qui sera violée par les doublons. Vous obtiendrez un message d'erreur car vous avez des doublons. La table des exceptions contiendra les rowids des lignes dupliquées.

    alter table add constraint
    unique --or primary key
    (dupfield1,dupfield2) exceptions into exceptions_table;
  3. Joignez votre table avec exceptions_table par rowid et supprimez les dups.

    delete original_dups where rowid in (select ROW_ID from exceptions_table);
  4. Si le nombre de lignes à supprimer est important, créez une nouvelle table (avec toutes les subventions et tous les index) anti-jointure avec exceptions_table par rowid et renommez la table originale en table original_dups et renommez new_table_with_no_dups en table originale.

    create table new_table_with_no_dups AS (
        select field1, field2 ........ 
        from original_dups t1
        where not exists ( select null from exceptions_table T2 where t1.rowid = t2.row_id )
    )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X