Maison >base de données >Oracle >Comment supprimer les données en double dans Oracle

Comment supprimer les données en double dans Oracle

coldplay.xixi
coldplay.xixioriginal
2021-01-04 17:36:2652655parcourir

Comment supprimer les données en double dans Oracle : 1. Recherchez toutes les lignes en double pour la colonne spécifiée et supprimez-les. La méthode consiste à compter ; 2. Supprimez toutes les lignes en double. Le code est [supprimer de nayi224_180824 t où. t.rowid dans].

Comment supprimer les données en double dans Oracle

L'environnement d'exploitation de cet article : système Windows 7, version oracle9i, ordinateur Dell G3.

Recommandé (gratuit) : base de données Oracle

Oracle supprime les données en double Méthode :

Créer des données de test

create table nayi224_180824(col_1 varchar2(10), col_2 varchar2(10), col_3 varchar2(10));
insert into nayi224_180824select 1, 2, 3 from dual union allselect 1, 2, 3 from dual union allselect 5, 2, 3 from dual union allselect 10, 20, 30 from dual ;commit;select*from nayi224_180824;
COL_1 COL_2 COL_3
1 2 3
1 2 3
5 2 3
10 20 30

Pour la colonne spécifiée, vérifier le résultat défini après la déduplication

distinct

select distinct t1.* from nayi224_180824 t1;
COL_1 COL_2 COL_3
10 20 30
1 2 3
5 2 3

La méthode est très limitée car elle ne peut dédupliquer que toutes les colonnes de requête. Si je souhaite dédupliquer col_2 et col3, alors mon jeu de résultats ne peut avoir que les colonnes col_2 et col_3, mais pas col_1.

select distinct t1.col_2, col_3 from nayi224_180824 t1
COL_2 COL_3
2 3
20 30

Mais c'est aussi la façon la plus simple et la plus facile d'écrire.

row_number()

select *  from (select t1.*,
               row_number() over(partition by t1.col_2, t1.col_3 order by 1) rn          
               from nayi224_180824 t1) t1 where t1.rn = 1;
COL_1 COL_2 COL_3 RN
1 2 3 1
10 20 30 1

C'est beaucoup plus compliqué à écrire, mais il a une plus grande flexibilité.

Pour la colonne spécifiée, recherchez toutes les lignes en double

comptez avoir

select *  from nayi224_180824 t 
where (t.col_2, t.col_3) in (select t1.col_2, t1.col_3                                
from nayi224_180824 t1                               
group by t1.col_2, t1.col_3                              
having count(1) > 1)
COL_1 COL_2 COL_3
1 2 3
1 2 3
5 2 3

Vérifiez deux fois le tableau, le l'efficacité sera moindre. Non recommandé.

comptez plus

select *  from (select t1.*,               
count(1) over(partition by t1.col_2, t1.col_3) rn          
from nayi224_180824 t1) t1 where t1.rn > 1;
COL_1 COL_2 COL_3 RN
1 2 3 3
1 2 3 3
5 2 3 3

Ne vérifiez le tableau qu'une seule fois, recommandé.

Supprimez toutes les lignes en double

delete from nayi224_180824 t where t.rowid in (                   
select rid                     
from (select t1.rowid rid,                                   
count(1) over(partition by t1.col_2, t1.col_3) rn                              
from nayi224_180824 t1) t1                    
where t1.rn > 1);

Modifiez simplement légèrement l'instruction ci-dessus.

Supprimez les données en double et conservez-en une

Méthode de fonction analytique

delete from nayi224_180824 t where t.rowid in (select rid                     
from (select t1.rowid rid,
    
    row_number() over(partition by t1.col_2, t1.col_3 order by 1) rn                             
    from nayi224_180824 t1) t1                    
    where t1.rn > 1);

a la grande flexibilité constante des fonctions analytiques. Vous pouvez faire ce que vous voulez avec le regroupement et modifier la clause orderby pour répondre à des exigences telles que "conserver l'identifiant maximum". Le

groupe par

delete from nayi224_180824 t where t.rowid not in
       (select max(rowid) from nayi224_180824 t1 group by t1.col_2, t1.col_3);

sacrifie une certaine flexibilité en échange d'une plus grande efficacité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn