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 :

Can't specify target in FROM clause


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut Can't specify target in FROM clause
    Bonjour à tous!

    J'ai un petit soucis, et j'avoue ne pas bien comprendre pourquoi.
    J'ai toujours eu du mal avec cette erreur mais il me semblait que la solution du AS corrigait ça, pourtant j'ai encore la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE infos AS p1 set p1.px = p1.px - 1000
    WHERE p1.id = 1 AND p1.ip IN 
       (SELECT p2.ip FROM infos AS p2 WHERE p2.id = 2)
    You can't specify target table 'p1' for update in FROM clause

    Pourtant pas de P1 dans le FROM...
    Une idée? J'a trompé?
    Linio

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonjour,
    vous ne pouvez pas effectuer un UPDATE avec une sous-requête SELECT travaillant sur la même table, pour effectuer cette requête, vous devez créer une table temporaire qui fera la passerelle entre le SELECT et l'UPDATE.

    Cela a été dit plusieurs fois dans les derniers jours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UPDATE infos AS p1 
     SET p1.px = p1.px - 1000
     WHERE p1.id = 1 AND p1.ip IN 
     (
      SELECT * 
       FROM 
       (
        SELECT p2.ip 
         FROM infos AS p2 
         WHERE p2.id = 2
       ) 
       tmp
     )
    ;
    Cordialement,
    DaRiaN.

  3. #3
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Je n'y entendrai donc jamais vraiment grand chose à cette erreur...

    L'astuce marche merci beaucoup !
    Linio

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    j'utilise la même solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE VNVO.VO_Cotation V SET V.defaut=1 WHERE V.id IN
    (SELECT * FROM 
    (SELECT V1.id FROM VNVO.VO_Cotation V1)
    AS tmp);
    mais j'ai toujours la même erreur.
    Est-ce que la syntaxe est bonne?
    Est-ce qu'il faut créer une table temporaire avec CREATE TABLE?

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    C'est bon, j'ai fait une solution du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE VNVO.tempo SELECT V1.id AS v1_id FROM VNVO.VO_Cotation V1;
    UPDATE VNVO.VO_Cotation V SET V.defaut=1 WHERE V.id IN
    (SELECT * FROM VNVO.tempo);

  6. #6
    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,
    Je crois que ce serait plus rapide sans sous-requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE VNVO.tempo SELECT V1.id AS v1_id FROM VNVO.VO_Cotation V1;
    UPDATE VNVO.VO_Cotation V JOIN VNVO.tempo T ON(V.id=T.v1_id)
    SET V.defaut=1;
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/03/2012, 17h31
  2. Réponses: 2
    Dernier message: 26/04/2011, 09h58
  3. Réponses: 2
    Dernier message: 17/03/2008, 15h38
  4. Réponses: 3
    Dernier message: 07/03/2008, 14h31
  5. Column 'c2' in from clause is ambiguous
    Par spiale dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/06/2007, 08h59

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