Maison >base de données >Oracle >Comment supprimer les données en double dans Oracle
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].
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.
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!