IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Suppression de doublon dans une table [10gR2]


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut Suppression de doublon dans une table
    Bonjour, j'ai une table qui contient des doublons, j'aimerai supprimer les doublons en gardant le Id le plus petit, voici un exemple

    Nom : doublon.JPG
Affichages : 630
Taille : 28,5 Ko

    je veux garder seulement ID = 20,
    NB : ça c'est à titre d'exemple il y a centaine de ligne en doublon

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 256
    Points : 12 919
    Points
    12 919
    Par défaut
    Bonjour,
    Tu peux utiliser une jointure dans la requête de suppression :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    delete t1
    from MaTable t1
    inner join MaTable t2 on (les critères pour trouver les doublons)
    and t1.id > t2.id

    Tatayo.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Merci de me répondre,
    j'utilise TOAD 15 pour lancer le script mais on dirait qu'il indique une erreur sur FROM
    si j'insiste pour le lancer voici l'erreur
    ORA-00933: la commande SQL ne se termine pas correctement

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    voici une capture
    Images attachées Images attachées  

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 256
    Points : 12 919
    Points
    12 919
    Par défaut
    Visiblement Oracle n'aime pas les jointures avec un DELETE.
    Dans ce cas un EXIST fera l'affaire:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    delete from Matable t1
    where exists
    (
    select 1 from MaTable t2 on (les critères pour trouver les doublons) 
    and t1.id > t2.id
    )
    Ou avec un IJ:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    delete from Matable t1
    where t1.id in
    (
    select t1.id from MaTable t2 on (les critères pour trouver les doublons) 
    and t1.id > t2.id
    )

    Tatayo.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    bonjour,
    j'ai essayé les deux mais il y a une erreur sur ON
    Images attachées Images attachées  

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Non mais....

    Il y a une coquille dans la requête proposée par Tatayo (remplacer ON par WHERE)

    il ne faut pas coder :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delete from Matable T1
    where exists
         (select 1 
          from MaTable T2 
             on (les critères pour trouver les doublons) 
            and T1.id > T2.id
         )

    Mais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delete from Matable T1
    where exists
         (select 1 
          from MaTable T2 
          where (les critères pour trouver les doublons) 
            and T1.id > T2.id
         )

    Par exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    delete from Matable T1
    where exists
         (select 1 
          from MaTable T2 
          where T2.COL_B=T1.COL_B
            and T2.COL_C=T1.COL_C
            and T1.id > T2.id
         )

    Les critères qui permettent de déterminer les doublons sont à adapter à vos besoins.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Si par doublons vous voulez dire doublons dans les colonnes col_b, col_c, col_d, etc.. voici une manière de procéder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    create table t as
    with t as
    (select 20   id, 136 col_b, 89 col_c, '036/2021' col_e from dual union all
     select 549  id, 136 col_b, 89 col_c, '036/2021' col_e from dual union all
     select 1460 id, 136 col_b, 89 col_c, '036/2021' col_e from dual 
    )
    select * from t;
     
    SQL> select * from t;
     
            ID      COL_B      COL_C COL_E
    ---------- ---------- ---------- --------
            20        136         89 036/2021
           549        136         89 036/2021
          1460        136         89 036/2021
     
     
    SQL> delete from t  where id not in (select min(id) from t group by col_b,col_c,col_e);
     
    2 rows deleted.
     
    SQL> select * from t;
     
            ID      COL_B      COL_C COL_E
    ---------- ---------- ---------- --------
            20        136         89 036/2021

    Ceci suppose que les colonnes col_b, col_c et col_e ne peuvent pas être NULL

    Bien Cordialement
    Mohamed Houri

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si le volume de données à supprimer est faible comparativement à la taille de la table (disons moins de 0,1% au doigt mouillé), j'aime bien passer par les rowid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    delete from MaTable
     where rowid in (select rid
                       from (select rowid as rid
                                  , row_number() over(partition by col_B
                                                                 , col_C
                                                                 , col_D
                                                                 , col_E
                                                                 , col_F
                                                                 , col_G
                                                                 , col_H
                                                                 , col_I
                                                                 , col_J
                                                                 , col_K
                                                          order by ID asc) as rn
                               from MaTable)
                      where rn > 1);
    J'ai mis quelques données ici : https://dbfiddle.uk/dAI07O6i

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Il y a une coquille dans la requête proposée par Tatayo (remplacer ON par WHERE)
    Merci beaucoup ça marche avec WHERE, sujet résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2016] requête de suppression des doublons dans une table access
    Par arrot dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/02/2020, 08h02
  2. Réponses: 8
    Dernier message: 16/08/2018, 18h50
  3. [WD15] suppression de doublons dans une table
    Par Yolak dans le forum WinDev
    Réponses: 4
    Dernier message: 02/05/2010, 20h55
  4. Suppression doublon dans une table
    Par sat83 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/09/2008, 11h37
  5. Suppression de doublons dans une table partionnée
    Par ludmillaj dans le forum Oracle
    Réponses: 10
    Dernier message: 27/12/2005, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo