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

Requêtes et SQL. Discussion :

Recherche de quasi doublons [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut Recherche de quasi doublons
    Bonjour,

    je cherche à supprimer des doublons dans une table sans y parvenir. Je veux supprimer toutes les lignes dont il existe la même valeur moins une lettre "Q".

    Titi
    TataQ => Ne pas supprimer puisque pas de "Tata" seul dans la table
    Toto
    TotoQ => A supprimer

    Voila la requête qui me semble-t-il devrait parvenir à ce résulat, mais elle est extremement longue (infaisable) sur un petite table de 45000 lignes avec 6000 données à supprimer :

    Code Requete interminable qui d'après moi devrait fonctionner : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM MaTable AS T1
    WHERE EXISTS (
        SELECT top 1 *
        FROM MaTable AS T2
        WHERE T2.MaColonne & "Q" = T1.MaColonne);

    J'ai essayé entre autres ceci sans succès :
    Code Essais ne donnant pas de meilelurs résultats : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT *
    FROM MaTable AS T1
    WHERE Right(T1.MaColonne,1) = "Q" AND EXISTS (
        SELECT top 1 *
        FROM MaTable AS T2
        WHERE T2.MaColonne like Left(T1.MaColonne, len(T1.MaColonne) -1));
     
    SELECT *
    FROM MaTable AS T1
    WHERE Right(T1.MaColonne,1) = "Q" AND EXISTS (
        SELECT top 1 *
        FROM MaTable AS T2
        WHERE T2.MaColonne & "Q" = T1.MaColonne);


    Et curieusement, même si la requete suivante ne me retourne pas les bons résultats (elle retourne les données sans le "Q" à la fin dont il existe la même avec un "Q", alors que ce sont les "Q" que je veux supprimer, mais le nombre de résultats retournés est le bon avec cette requete), elle s'exécute instantanément sans que je comprenne pourquoi sa petite soeur que j'ai mise en premier ci-dessus ne fait pas de même .... :
    Code Mauvaise requete mais execution instantanée ... : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM MaTable AS T1
    WHERE EXISTS (
        SELECT top 1 *
        FROM MaTable AS T2
        WHERE T2.MaColonne = T1.MaColonne & "Q" );
    Retourne 6074 lignes : Le nombre à supprimer, puisque correspond aux éléments sans "Q" qui existent dans la table en version avec "Q". Il me faut "juste" récupérer les correspondant avec le "Q" de chaque élément de cette table ...


    Une autre solution, qui elle fonctionne (du moins s'exécute), mais ne retourne pas le bon nombre de valeurs, je ne sais pas pourquoi :
    Code Nombre de résultats différents de la précédente : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM MaTable AS T1
    WHERE (Left(T1.MaColonne, Len(T1.MaColonne) - 1)) IN (
        SELECT T2.MaColonne
        FROM MaTable AS T2
        WHERE EXISTS (
            SELECT TOP 1 *
            FROM MaTable AS T3
            WHERE T3.MaColonne = T2.MaColonne & "Q"));
    Retourne 6129 lignes (dont seulement 54 correspondent à celle qui en retourne 6074 ci-dessus)



    Bref, je patauge ....

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut ZuZu,

    ah... les histoires de Q c'est toujours compliquées...

    un truc comme ca? :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select t1.macolonne from matable as t1 inner join matable as t2 on (t1.macolonne=t2.macolonne & "Q")

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Bonjour vodiem,

    je ne sais pas si je réponds ou si je cours me cacher .....

    Merci pour la réponse, je ne sais pas pourquoi je suis resté bloqué là-dessus ... Peut-être parce que j'ai trop voulu suivre le tuto de SQLpro sur les doublons et que c'est la seule solution que j'y ai trouvé (mais non c'est pas de sa faute .... )

    Par contre pourquoi les autres requetes mettent des plombes à s'exécuter ? Ca je ne comprends pas. Si tu peux me dire rapidement pourquoi les autres (la première tout au moins, que je pensais bonne) ne marchent pas je serai moins bête ce soir.

    Comme l'idée c'était de supprimer, je met la requete finale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE *
    FROM MaTable AS T0
    WHERE T0.ID IN 
        (SELECT T1.ID 
        FROM MaTable AS T1 
        INNER JOIN MaTable AS T2 
        ON T1.MaColonne=T2.MaColonne & "Q")

    En tout cas merci et bonne journée

    PS : Pour la lettre "en sus" je me suis dit que ca motiverait les troupes de la laisser ^^

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    je voulais pas trop commenter les sql mais bon, je m'en voudrais d'être la cause de tes insomnies...

    > "select top 1" dans les Exists ne sert à rien.
    > il faut éviter Exists, In dans la mesure du possible pour des raisons de performance.

    1er SQL: fonctionne. pourquoi c'est long? un bug dans la session..., le moment de changer de pc..., un moyen de justifier ton salaire...
    2me SQL: les deux fonctionnent aussi. juste éventuellement un Nz() sur le Len() qui peut éventuellement renvoyer un Null.
    3me SQL: En inversant les T1 et T2 dans la clause WHERE pour avoir le bon résultat c'est du kif kif bourricot avec la première.
    vu que T1=T2 y a pas de raison que cela marche mieux ainsi.
    4me SQL: formulation incorrecte: tu n'as pas su reformuler convenablement à parti du SQL fonctionnel précédent:
    ex: en ajoutant "TotoA" qui ne doit pas être effacé (puisque unique), on a "TotoA" qui devient avec le left => "Toto" qui est IN "..., Toto" <- mais qui vient de TotoQ... bref : pas bon.

    quand à la dernière SQL de suppression... mouais...
    ce sql devrait convenir aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE t1.* FROM matable AS t1 WHERE t1.macolonne=ANY (SELECT t2.macolonne & "Q" FROM matable AS t2)
    alors comment ca fait d'être moins bête?

    ps: la lettre en sus... tu veux dire les Q en sus ? => "sus les Q!..." ^^

  5. #5
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    J'essayais d'être plus subtil sur les Q mais t'as raison, parfois il faut savoir rentrer dedans.

    Entre la première requete et la 3eme, je suis bien d'accord avec toi, mais Access ne l'est pas .... Je ne comprends vraiment pas qu'en inversant simplement les colonnes les opérandes du WHERE une fois ca soit immédiat, et l'autre elle mette un temps fou (1min pour afficher la première page, et 1min supplémentauire par page que je parcours (PGDOWN), si bien que si je veux aller à la dernière ligne je n'ai pas la patience d'attendre ...)
    J'ai un collègue qui ne connais pas access mais qui bosse sur oracle qui ne comprends pas non plus.

    Citation Envoyé par Vodiem
    alors comment ca fait d'être moins bête?
    J'ai pas remarqué de changement, c'est qu'il doit rester encore pas mal de boulot ... ^^

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

Discussions similaires

  1. Recherche et affichage de quasi-doublons
    Par Shiva dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/12/2014, 17h52
  2. Rechercher des doublons dans ACCESS(quasi doublons)
    Par ingal30 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/03/2010, 13h57
  3. recherche de quasi doublons dans 1 table
    Par tuxy dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/10/2008, 21h35
  4. Selection de Quasis Doublons
    Par norior dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/01/2006, 14h30
  5. quasi doublon
    Par chris30 dans le forum Oracle
    Réponses: 5
    Dernier message: 09/09/2004, 14h29

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