Maison >base de données >Oracle >Résumer et organiser les méthodes courantes pour supprimer les données en double de la base de données Oracle

Résumer et organiser les méthodes courantes pour supprimer les données en double de la base de données Oracle

WBOY
WBOYavant
2022-08-22 17:59:303363parcourir

Cet article vous apporte des connaissances pertinentes sur Oracle Il présente principalement les données en double dans le tableau qui sont souvent supprimées lors du nettoyage des données. Alors, comment les gérer dans Oracle ? Jetons-y un coup d'œil ensemble, j'espère que cela sera utile à tout le monde.

Résumer et organiser les méthodes courantes pour supprimer les données en double de la base de données Oracle

Tutoriel recommandé : "Tutoriel vidéo Oracle"

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_180824
select 1, 2, 3 from dual union all
select 1, 2, 3 from dual union all
select 5, 2, 3 from dual union all
select 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érifiez les doublons Ensemble de résultats

distinct

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

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 manière d’écrire la plus simple et la plus facile à comprendre.

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 difficile à é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

Vous devez vérifier la table deux fois, donc l'efficacité sera faible. Non recommandé.

compte terminé

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

Il suffit de vérifier le tableau une 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".

group by

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);

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

Tutoriel recommandé : "Tutoriel vidéo Oracle"

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer