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 MySQL Discussion :

doublons, requête tirée du cours développez


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de schwarzy2
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 464
    Points : 288
    Points
    288
    Par défaut doublons, requête tirée du cours développez
    Bonjour à tous, j'ai une table avec 3 champs, un champ num, un champ num_candidat, et un champ date_p.
    J'ai dans cette table des doublons relatifs, que je veux supprimer avec la requête tirée du cours de développez.com:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE
    FROM   passage T
    WHERE  T.num < ANY (SELECT num
                        FROM   passage T2
                        WHERE  T.num<> T2.num
                          AND  T.num_candidat= T2.num_candidat
                          AND  T.date_p = T2.date_p)
    mais j'obtiens le message d'erreur suivant, que je ne comprends pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'T
    WHERE  T.num < ANY (SELECT num
                        FROM   passage T2
          ' at line 2
    Si l'un de vous avait une explication...
    Merci d'avance!

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    MySQL ne semble pas supporter les alias de table dans les requêtes delete
    le plus simple reste de passer par une table temporaire

  3. #3
    Membre actif Avatar de schwarzy2
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 464
    Points : 288
    Points
    288
    Par défaut
    J'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE suppr AS SELECT * FROM passage T
    WHERE  T.num < ANY (SELECT num
                        FROM   passage T2
                        WHERE  T.num<> T2.num
                          AND  T.num_candidat= T2.num_candidat
                          AND  T.date = T2.date);
    DELETE  FROM passage WHERE num IN(SELECT num FROM suppr);
    et ça me semble bon...je ne me suis pas trompée?

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    SAluton,
    Depuis MySQL 3.23, vous pouvez créer une table à partir d'une autre, en ajoutant une commande SELECT après la commande CREATE TABLE :

    CREATE TABLE new_tbl SELECT * FROM orig_tbl;

    MySQL va créer une nouvelle colonne pour chaque colonne de résultat de la commande SELECT. Par exemple :

    mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (a), KEY(b))
    -> TYPE=MyISAM SELECT b,c FROM test2;
    Je ne vois pas trace de AS dans la syntaxe de la doc.

  5. #5
    Membre actif Avatar de schwarzy2
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 464
    Points : 288
    Points
    288
    Par défaut
    ah oui...effectivement on peut faire sans AS...je ne savais pas.
    merci du conseil.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    MySQL ne semble pas supporter les alias de table dans les requêtes delete
    le plus simple reste de passer par une table temporaire
    MySQL supporte très bien... à condition d'utiliser sa syntaxe spécifique, dite "DELETE multi-table" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE T
    FROM   passage T
    WHERE  T.num < ANY (SELECT num
                        FROM   passage T2
                        WHERE  T.num<> T2.num
                          AND  T.num_candidat= T2.num_candidat
                          AND  T.date_p = T2.date_p)
    Ce qui provoque l'erreur "", qui se contourne en transformant la table-source en sous-requête dans le FROM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE T
    FROM   passage T
    WHERE  T.num < ANY (SELECT num
                        FROM   (SELECT * FROM passage) T2
                        WHERE  T.num<> T2.num
                          AND  T.num_candidat= T2.num_candidat
                          AND  T.date_p = T2.date_p)
    Explication : MySQL implémente les "tables virtuelles" (sous-requêtes dans le FROM) en créant une table temporaire ; ainsi la lecture et l'écriture ne se font pas sur la même table.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/02/2013, 00h15
  2. [AC-2010] Doublon requête + comptage
    Par Julianinho dans le forum Modélisation
    Réponses: 6
    Dernier message: 23/06/2012, 18h10
  3. Suppression doublons requête SQL
    Par dimferte dans le forum SQL
    Réponses: 6
    Dernier message: 02/12/2008, 10h02
  4. Tri doublons requête SQL
    Par inc002 dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/07/2007, 16h35
  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