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 recherche de doublons à améliorer


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut Requête de recherche de doublons à améliorer
    Bonjour.

    Je suis en train de corriger une table qui contient environ 10000 lignes. Il y a eu pas mal d'erreurs de saisie, ce qui fait qu'elle comporte un nombre important de doublons que je dois supprimer (la table n'avait pas de contrainte d'unicité).

    VAC_ID (clé primaire auto-incrémentée)
    VAC_DATE
    D1_ID
    D2_ID

    Il ne doit y avoir qu'un seul "couple" D1_ID et D2_ID par VAC_DATE. J'ai donc créé cette requête pour trouver les doublons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*) AS VAC_DOUBLON, D1_ID, D2_ID, VAC_DATE
    FROM T_VACATIONS
    GROUP BY D1_ID, D2_ID, VAC_DATE
    HAVING COUNT(*) > 1
    ORDER BY VAC_DATE ASC, D1_ID ASC
    Elle fait le boulot mais comme il y a beaucoup de lignes à supprimer, j'aimerais savoir comment faire pour afficher également la colonne VAC_ID afin que je puisse créer un script pour supprimer en un clic tous les doublons (et même certains "triblons" et "quadrublons").

    Merci.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Tu peux faire comme ça :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT ALL VAC_ID, D1_ID, D2_ID, VAC_DATE
    FROM T_VACATIONS
    WHERE (D1_ID, D2_ID, VAC_DATE) IN (
        SELECT ALL D1_ID, D2_ID, VAC_DATE
        FROM T_VACATIONS
        GROUP BY 1, 2, 3
        HAVING COUNT(*) > 1
    )
    ORDER BY 2 ASC, 3 ASC, 4 ASC;

  3. #3
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Non, erreur de syntaxe.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Qu'est-ce qui t'empêche de la communiquer ou de la corriger ?

    Je relis, je ne vois pas d'erreur de syntaxe. Quel est ton SGBD ?

  5. #5
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Il s'agit d'HSQLDB dans LO Base. J'ai testé en remplaçant le GROUP BY 1, 2, 3 par le nom des colonnes mais rien n'y fait (table dupliquée en T_VACATIONS2 pour les tests) :

    Nom : Capture d’écran du 2023-01-22 14-39-08.png
Affichages : 232
Taille : 27,3 Ko

    Et en exécutant en SQL direct :

    Nom : Capture d’écran du 2023-01-22 14-39-49.png
Affichages : 279
Taille : 46,3 Ko

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    HSQLDB dans LO Base
    Inconnu au bataillon.

    Le seul truc un peu inhabituel est le (cols) IN (SELECT cols), sais-tu si la syntaxe est supportée ? Pour savoir tu peux essayer ces 2 requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT (123, 234) IN ((123, 234)); -- 1/TRUE
    SELECT (123, 234) IN (SELECT ALL 123, 234); -- 1/TRUE
    Sinon tu peux reformuler la requête proposée précédemment en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT ALL VAC_ID, D1_ID, D2_ID, VAC_DATE
    FROM T_VACATIONS AS t1
    INNER JOIN (
        SELECT ALL D1_ID, D2_ID, VAC_DATE
        FROM T_VACATIONS
        GROUP BY 1, 2, 3
        HAVING COUNT(*) > 1
    ) AS t2 ON TRUE
        AND t1.D1_ID = t2.D1_ID
        AND t1.D2_ID = t2.D2_ID
        AND t1.VAC_DATE = t2.VAC_DATE
    ;

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Citation Envoyé par Nerva Voir le message
    Il ne doit y avoir qu'un seul "couple" D1_ID et D2_ID par VAC_DATE.
    Attention à ce point, ce n'est pas ce que vous avez codé.
    Un seul couple (D1_ID, D2_ID) par VAC_DATE signifie que ceci doit être considéré comme un doublon :
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    D1_ID  D2_ID  VAC_DATE
    -----  -----  ----------
        1      2  2023-01-23
        1      3  2023-01-23
    Or, votre requête n'identifie pas ce cas.

    L'erreur pouvant venir de la phrase citée, je préfère simplement que vous vérifiez ce point.

  8. #8
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Oui, il ne s'agit pas d'un couple mais d'un triplet. Un doublon = 2 fois (ou plus) D1_ID D2_ID VAC_DATE

Discussions similaires

  1. Requête de recherche de doublon
    Par BernardBouree dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 30/03/2020, 19h36
  2. [MySQL] Requête pour recherche de doublons qui ne fonctionne plus : HTTP404
    Par HAbroc dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/06/2012, 11h13
  3. Requête pour rechercher des doublons partiels
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2011, 11h22
  4. Requête à le recherche de doublons
    Par titinesaku dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/05/2011, 09h29
  5. [Requête/SQL]Recherche de doublons
    Par Mr T 94 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 16/04/2007, 00h51

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