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

WinDev Discussion :

Trouver des doublons d'enregistrement avec une requete SQL [WD18]


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut Trouver des doublons d'enregistrement avec une requete SQL
    Bonjour

    J'ai un fichier qui contient X rubriques.
    Je voudrais trouver des doublons dans ce fichier à l'aide d'une requete.
    Attention, le doublon n'est pas sur la totalité des rubriques de l'enregistrement mais seulement sur quelques rubriques.
    Est-ce possible ?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 153
    Points
    2 153
    Par défaut
    Oui : GROUP BY LesChampsADoublon HAVING count(*)>1

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    Merci Michel

    cela fonctionne bien pour les trouver. J'ai oublié de préciser que je voulais les éliminer ensuite .
    J'ai essayé ça mais ma requête tourne dans le vide (j'ai 60 000 enreg environ)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT *
    FROM   T_DOUBLON T1
    WHERE  EXISTS (SELECT *
                   FROM   T_DOUBLON T2
                   WHERE  T1.NUM <> T2.NUM
                     AND  T1.NOM    = T2.NOM
                     AND  T1.PRENOM = T2.PRENOM)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    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 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Bonjour,
    L'utilisation d'une jointure externe sera bien plus performante qu'une sous-requête corrélée.
    Le sujet a été souvent traité dans la section sql du forum, tu devrais y trouver ton bonheur.

    Tatayo.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    Une jointure externe sur toutes les rubriques doublonnées ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    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 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Oui, où est le problème ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 153
    Points
    2 153
    Par défaut
    Sinon tu fais un CREATE TABLE AS SELECT de ta requête de dédoublonnage... et tu obtiens une tableau propre...

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    J'ai fait comme ça et cela semble fonctionner quand je fais un SELECT au lieu de DELETE

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM table
    LEFT OUTER JOIN (
            SELECT MIN(id) as id, champ1, champ2, champ3
            FROM table
            GROUP BY champ1, champ2, champ3
        ) as t1 
        ON table.id = t1.id
    WHERE t1.id IS NULL

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    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 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Quelle est la base de données ?
    Si c'est HF, je doute qu'il supporte une jointure dans un DELETE.

    Tatayo.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    Effectivement je suis sur HF.
    Le SELECT fonctionne bien. Je n'ai pas encore testé le DELETE.
    Si celui-ci ne fonctionne pas j'aurais au moins les ID à supprimer ce qui me permettra de faire un DELETE FROM fichier WHERE ID EXISTS IN.


    Bruno

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    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 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Tu peux optimiser ta requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.id
    from LaTable t1
    left outer join LaTable t2 on t1.id > t2.id and t1.nom = t2.nom and t1.prenom = t2.prenom
    where t2.id is not null

    Tatayo.

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 91
    Points
    91
    Par défaut
    J'ai essayé et cela a l'air + rapide en effet par contre j'ai des doublons (je comprends pas pourquoi d'ailleurs). En mettant un distinct j'ai la même chose que la requete précédente.

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 153
    Points
    2 153
    Par défaut
    L’inconvénient de cette méthode est qu'elle ne remonte pas de façon évidente les triplons et autres...

    Je vous recommande vivement de passer par un GROUP BY/HAVING, de générer une table tampon et de supprimer vos doublons dans un second temps.

    DISTINCT n'est pas un fonction utile au dédoublonnage, cela permet juste de visualiser les différentes valeurs d'un champ.... et en plus je soupçonne HF de faire n'importe quoi en présence d'un DISTINCT

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 153
    Points
    2 153
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.id
    from LaTable t1
    left outer join LaTable t2 on t1.id > t2.id and t1.nom = t2.nom and t1.prenom = t2.prenom
    where t2.id is not null

    => je ne vois aucun intérêt au LEFT JOIN puisque tu fais une restriction sur la table lefté... donc autant faire un INNER JOIN et supprimer la clause WHERE (ce qui revient exactement au même).

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    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 285
    Points : 12 987
    Points
    12 987
    Par défaut
    En fait j'étais parti de la requête qui renvoie les id à garder, et j'ai juste changé le critère pour récupérer les id à jeter:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.id
    from LaTable t1
    left outer join LaTable t2 on t1.id > t2.id and t1.nom = t2.nom and t1.prenom = t2.prenom
    where t2.id is null
    C'est pour cela que la requête renvoie des doublons, puisque justement elle doit renvoyer les doublons !
    Mais je suis d'accord, ici autant prendre une jointure interne.

    Tatayo.

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

Discussions similaires

  1. compter enregistrement dans une requete sql avec UNION
    Par dbzzzde dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/10/2007, 11h43
  2. Somme avec une requete sql
    Par virtuose dans le forum Langage SQL
    Réponses: 8
    Dernier message: 26/01/2006, 17h32
  3. Problème avec une requete SQL sous access
    Par Luther13 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 14/12/2005, 11h39
  4. [VB.NET] Remplir une ComboBox avec une requete sql
    Par graphicsxp dans le forum Windows Forms
    Réponses: 6
    Dernier message: 22/03/2005, 16h29
  5. [ORACLE][SQL] procedure sous delphi avec une requete SQL
    Par nivet dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2004, 14h43

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