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 :

dédoublonner des lignes par rapport à la date


Sujet :

Langage SQL

  1. #1
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut dédoublonner des lignes par rapport à la date
    Bonjour,

    Je suis face à une requête probablement assez simple mais je n'arrive pas à l'écrire.

    J'ai une table contenant une liste d'adresses e-mails avec une date de création.
    Malheureusement je n'avais pas mis de contrainte d'unicité sur l'e-mails et suite à des intégrations diverses, la table contient désormais plus doublons (de 1 à 2 doublon).

    Je souhaite donc supprimer tous les doublons dont la date de création (date d'enregistrement) n'est la plus élevée.

    Voici ce que j'avais commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # pour afficher les doublons (ok ça fonctionne)
    SELECT * FROM `matable` GROUP BY email HAVING (count(email)>1))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # pour tenter de supprimer les doublons
    DELETE FROM matable WHERE date IN (SELECT MIN(date) FROM `matable` GROUP BY email HAVING (count(*)>1))
    Je rencontre différentes erreurs de syntaxe parce que je ne sais pas formuler la requête.

    Un coup de main svp ?
    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Avant il faut changer le nom de colonne Date par un autre nom

    essais ceci
    faire un select avant de lancer la suppression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE FROM matable WHERE tadate = (SELECT MIN(tab2.tadate) 
                                                           FROM matable tab2
                                                          Where tab2.email=matable.email
                                                          GROUP BY tab2.email 
                                                         HAVING (count(*)>1
                                                          )

  3. #3
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Tout ce que j'ai posté est fictif, ce ne sont pas les vrais noms de table et champs.
    Ok je teste ta formulation.

  4. #4
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Je rencontre cette erreur:

    #1093 - You can't specify target table 'matable' for update in FROM clause

    Merci pour ton aide.

  5. #5
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    C'est Mysql qui ne sait pas gérer les update/delete avec des select.
    Il faut que je passe par une autre solution.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * 
    FROM matable
    WHERE EXISTS
    (
     SELECT *
     FROM matable t2
     WHERE matable.email = t2.email
     AND matable.DATE > t2.DATE
    );

  7. #7
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    J'ai finalement pu dédoublonner la table, merci.
    Snipah merci aussi pour ton post, je crois que ta requête ne correspond pas à ma recherche, je l'aie lancée sur une table temporaire (copiée de la précédente, avec les doublons) mais elle ne retourne aucun résultat.

  8. #8
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Cependant j'ai cru et crois toujours qu'il fallait creuser ma recherche avec la clause EXISTS.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Et pourtant, un test rapide sous Oracle :

    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
     
    SQL> WITH t 
      2  AS
      3  (
      4   SELECT to_date('10/02/2009','dd/mm/yyyy') AS dt, 'aaa@aaa.aaa' AS email from dual union all
      5   SELECT to_date('11/02/2009','dd/mm/yyyy') AS dt, 'aaa@aaa.aaa' AS email from dual union all
      6   SELECT to_date('12/02/2009','dd/mm/yyyy') AS dt, 'aaa@aaa.aaa' AS email from dual union all
      7   SELECT to_date('15/02/2009','dd/mm/yyyy') AS dt, 'bbb@aaa.aaa' AS email from dual
      8  )
      9  SELECT * 
     10  FROM t
     11  WHERE EXISTS
     12  (
     13   SELECT *
     14   FROM t t2
     15   WHERE t.email = t2.email
     16   AND t.dt > t2.dt
     17  );
     
    DT       EMAIL
    -------- -----------
    12/02/09 aaa@aaa.aaa
    11/02/09 aaa@aaa.aaa

  10. #10
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Surement lié au fait que nos tables ne sont pas les mêmes niveau données car moi "aucun résultat retourné", alors que la première requête que j'ai écrite dans ce post me retourne bien tous mes doublons.

    Pas un problème, je m'en suis sortis ! Merci !

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

Discussions similaires

  1. insérer des lignes par rapport a une valeur dans la ligne au-dessus
    Par samihichem dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/05/2015, 09h08
  2. Creation de dossiers par rapport à la date des fichiers
    Par jucost dans le forum Discussions diverses
    Réponses: 2
    Dernier message: 08/05/2012, 12h45
  3. [WD-2010] Supprimer des lignes par rapport à une condition
    Par CG2956 dans le forum VBA Word
    Réponses: 2
    Dernier message: 10/01/2012, 01h50
  4. ordonner les parents par rapport aux dates des children
    Par fphenix dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2011, 13h29
  5. [access/vb.net] Suppression ligne par rapport date
    Par t1marlartiste dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/07/2007, 20h01

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