Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 20/02/2008, 14h37   #1
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 422
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 422
Points : 304
Points : 304
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 :
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
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 15h16   #2
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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 :
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.

Dernière modification par DaRiaN ; 20/02/2008 à 15h30. Motif: ajout de la requête
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/02/2008, 16h45   #3
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 422
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 422
Points : 304
Points : 304
Je n'y entendrai donc jamais vraiment grand chose à cette erreur...

L'astuce marche merci beaucoup !
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 12h40   #4
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 70
Points : 34
Points : 34
Bonjour,
j'utilise la même solution:

Code :
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?
FrenchFrogger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 14h05   #5
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 70
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 70
Points : 34
Points : 34
C'est bon, j'ai fait une solution du genre:

Code :
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);
FrenchFrogger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 15h00   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Inscription : novembre 2005
Messages : 2 423
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 423
Points : 3 223
Points : 3 223
Saluton,
Je crois que ce serait plus rapide sans sous-requête
Code sql :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 05h35.


 
 
 
 
Partenaires

Hébergement Web