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

Langage SQL Discussion :

Requête de suppression de doublons


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 701
    Points : 955
    Points
    955
    Par défaut Requête de suppression de doublons
    Bonjour a tous
    Après avoir répérer un ensemble de doublons je voudrais les supprimer mais en ajoutant un autre filtre du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE
    FROM   MESINFORMATIONS T1
    WHERE T1.LACLE < ANY (SELECT LACLE
                        FROM   MESINFORMATIONS T2
                        WHERE  T1.LACLE <> T2.LACLE
                          AND  T1.CHAMP1 = T2.CHAMP1
                          AND  T1.CHAMP2 = T2.CHAMP2
                          AND  T1.CHAMP3 = T2.CHAMP3
                          AND CHAMP4 >10 ) /* ajout d'un paramètre*/
    Pour m'expliquer je cherche a détruire tous les doublons pour champ1, champ2, champ3 pour les lesquels champ4>10.
    Est-ce la bonne syntaxe ?
    Merci à tous.

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    il me semble que ta requete est correcte sauf que le ANY de quel SGBD est il?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 701
    Points : 955
    Points
    955
    Par défaut
    ok je vais tester voir alors sinon le Sgdb c'est Firebird 2.5 !

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Les prédicats ALL, ANY(SOME) font parties de la norme sql2.

    Je ne sais pas trop ce que tu cherches à obtenir mais je pense que la condition champ4 > 10 devrait également être présente dans le WHERE du DELETE.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 701
    Points : 955
    Points
    955
    Par défaut
    je ne sais pas trop ce que tu cherches à obtenir mais...
    voici un peu une vue de mes données :
    champ1-----champ2-----champ3------champ4
    latif-----devalender-----12/12/2005-----5
    latif-----devalender-----12/12/2005-----5
    tatami-----jean-----21/12/2006------12
    tatami-----jean-----21/12/2006------12
    tatami-----jean-----21/12/2006------12
    tatami-----jean-----21/12/2006------12

    avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT champ1, champ2, champ3
    FROM   MESINFORMATIONS T1
    WHERE T1.LACLE < ANY (SELECT LACLE
                   FROM   MESINFORMATIONS T2
                   WHERE  T1.lacle <> T2.lacle
                     AND  T1.champ1 = T2.champ1
                     AND  T1.champ2 = T2.champ2
                     AND  T1.champ3 = T2.champ3)
    je me retrouve avec 6 doublons, or avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DELETE
    FROM   MESINFORMATIONS T1
    WHERE T1.LACLE < ANY (SELECT LACLE
                        FROM   MESINFORMATIONS T2
                        WHERE  T1.LACLE <> T2.LACLE
                          AND  T1.CHAMP1 = T2.CHAMP1
                          AND  T1.CHAMP2 = T2.CHAMP2
                          AND  T1.CHAMP3 = T2.CHAMP3
                          AND CHAMP4 >10 ) /* ajout d'un paramètre*/
    je voudrais qu'il me donne les doublons pour lesquels le champ4 >10 ce qui me reviendrait à détruire 4 tuples, comment puis je arriver à mes fins ?

    Citation Envoyé par skuatamad Voir le message
    je pense que la condition champ4 > 10 devrait également être présente dans le WHERE du DELETE.
    ce que j'ai essayé de mettre ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE
    FROM   MESINFORMATIONS T1
    WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                        FROM   MESINFORMATIONS T2
                        WHERE  T1.LACLE <> T2.LACLE
                          AND  T1.CHAMP1 = T2.CHAMP1
                          AND  T1.CHAMP2 = T2.CHAMP2
                          AND  T1.CHAMP3 = T2.CHAMP3
                          AND CHAMP4 >10 ) /* ajout d'un paramètre*/
    mais à ma grande surprise rien n'est supprimé

    Merci

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Perso je passerais par une table temporaire (ou une vue)

    d'abord la création de la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create view v_temp as (
    select max(id), champ1, champ2, champ3
    from ma_table
    where champ4 > 10
    group by champ1, champ2, champ3
    having count(*) > 1)
    Ensuite la requête de delete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete from ma_table A
    where champ4 > 10 and exists (select * from v_temp B where a.id <> b.id and a.champ1 = b.champ1 and a.champ2 = b.champ2 and a.champ3 = b.champ3)
    J'ai pas testé le code mais l'idée est là.

  7. #7
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    ce que j'ai essayé de mettre ici :


    Code :Sélectionner tout - Visualiser dans une fenêtre à part12345678910
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE
    FROM   MESINFORMATIONS T1
    WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                        FROM   MESINFORMATIONS T2
                        WHERE  T1.LACLE <> T2.LACLE
                          AND  T1.CHAMP1 = T2.CHAMP1
                          AND  T1.CHAMP2 = T2.CHAMP2
                          AND  T1.CHAMP3 = T2.CHAMP3
                          AND CHAMP4 >10 ) /* ajout d'un paramètre*/
    mais à ma grande surprise rien n'est supprimé
    Avez vous respecté la casse dans la vraie requete ? ( ici on a un champ4 et un CHAMP4 )
    et bien "prefixé" le CHAMP4 de la sous-requete ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T2.CHAMP4 >10 
    ou
    T2.CHAMP4 = T1.CHAMP4

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par devalender Voir le message

    je voudrais qu'il me donne les doublons pour lesquels le champ4 >10 ce qui me reviendrait à détruire 4 tuples, comment puis je arriver à mes fins ?
    La requête citée ne peut pas effacer 4 tuples mais seulement 3. En effet celui-ci qui a le plus petite valeur de la colonne tacle ne peut pas être supprimé à cause de l'infériorité stricte ( < ANY).
    Mais n'est-ce pas justement le but recherché?
    En général quand on dédoublonne on ne veut pas tout effacer, on veut garder un seul exemplaire.

    ce que j'ai essayé de mettre ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE
    FROM   MESINFORMATIONS T1
    WHERE champ4>10 AND T1.LACLE < ANY (SELECT LACLE
                        FROM   MESINFORMATIONS T2
                        WHERE  T1.LACLE <> T2.LACLE
                          AND  T1.CHAMP1 = T2.CHAMP1
                          AND  T1.CHAMP2 = T2.CHAMP2
                          AND  T1.CHAMP3 = T2.CHAMP3
                          AND CHAMP4 >10 ) /* ajout d'un paramètre*/
    mais à ma grande surprise rien n'est supprimé
    Avec le jeu d'essai mentionné, cette requête doit supprimer 3 tuples.
    Si elle ne le fait pas c'est sans doute qu'il y a un problème dans les données.
    Pour reproduire le problème il faudrait l'ordre CREATE TABLE et les INSERTs du jeu de données.

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/01/2012, 18h38
  2. Requête de suppression de doublons
    Par okilele dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/09/2010, 09h22
  3. Requête de suppression des doublons
    Par deleterz dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/08/2010, 18h40
  4. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  5. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04

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