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 :

Delete sur Select


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 18
    Par défaut Delete sur Select
    Bonjour,

    J'ai la requete suivante qui me retourne les bons résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TABLE1.CHAMP1
    FROM TABLE1
    LEFT JOIN TABLE2 ON TABLE1.CHAMP1 = TABLE2.CHAMP2
    LEFT JOIN TABLE3 ON TABLE1.CHAMP1  = TABLE3.CHAMP2
    WHERE TABLE2.CHAMP2 IS NULL
    AND TABLE3.CHAMP3 IS NULL
    Or je voudrai supprimer tous les resultat qu'elle me renvoie, donc je fais cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DELETE FROM TABLE1 WHERE CHAMP1 IN (
    SELECT TABLE1.CHAMP1
    FROM TABLE1
    LEFT JOIN TABLE2 ON TABLE1.CHAMP1 = TABLE2.CHAMP2
    LEFT JOIN TABLE3 ON TABLE1.CHAMP1  = TABLE3.CHAMP2
    WHERE TABLE2.CHAMP2 IS NULL
    AND TABLE3.CHAMP3 IS NULL
    )
    Et MySql me répond :

    You can't specify target table 'TABLE1' for update in FROM clause
    Je ne comprend pas pourquoi..

    Merci,

    Anthony

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Parce qu'il n'y a pas d'ordre d'exécution entre la requête et la sous-requête. Autrement dit, MySQL ne veut pas que ta requête scie la branche sur laquelle elle est assise...

    Le contournement consiste à ajouter un niveau de sous-requête dans le FROM :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE FROM TABLE1 WHERE CHAMP1 IN (
      SELECT CHAMP1 
      FROM (SELECT TABLE1.CHAMP1
        FROM TABLE1
          LEFT JOIN TABLE2 ON TABLE1.CHAMP1 = TABLE2.CHAMP2
          LEFT JOIN TABLE3 ON TABLE1.CHAMP1  = TABLE3.CHAMP2
        WHERE TABLE2.CHAMP2 IS NULL
          AND TABLE3.CHAMP3 IS NULL
      )
    )
    En effet, les sous-requêtes du FROM sont implémentées par la création de tables temporaires ; du coup, le SELECT et le DELETE portent bien sur des tables différentes et tout est OK. En fait, tu forces MySQL à exécuter d'abord la sous-requête et seulement ensuite la requête principale.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Ou, plus simplement, en consultant la :
    http://mysql.developpez.com/faq/?pag..._data_sans_ref
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. créer simple prototype de select, add, delet.. sur JSP
    Par ouzal dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/07/2010, 10h55
  2. [ASE 12.5.1] Performances sur SELECT et DELETE
    Par zayro dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 30/06/2006, 22h53
  3. [ASE 12.5.1] Performances sur SELECT et DELETE
    Par zayro dans le forum Sybase
    Réponses: 3
    Dernier message: 30/06/2006, 22h53
  4. Trigger sur select
    Par bilo2000 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/02/2004, 13h39
  5. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23

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