Erreur UPDATE Can't specify target in FROM clause [Résolu]

Signaler
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
-
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021
-
Bonjour,
J'ai cette erreur qui s'affiche mais je ne comprend pas pourquoi...
Après des recherches le problème viendrait du faite que je ne peux pas effectuer un UPDATE avec une sous-requête SELECT travaillant sur la même table.
Donc si c'est celà, je ne sais pas comment là corriger.


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

UPDATE employees
SET emp_superior_id =  (SELECT emp_id
                       FROM employees
                       JOIN posts ON pos_id = emp_pos_id 
                       JOIN shops ON sho_id = emp_sho_id
                       WHERE pos_libelle LIKE 'Manager%' AND sho_city = 'Arras'
                       HAVING MIN(emp_salary))

WHERE emp_id = (SELECT * FROM (SELECT emp_id 
                FROM employees 
                JOIN posts ON pos_id = emp_pos_id                               
                JOIN shops ON sho_id = emp_sho_id 
                WHERE pos_libelle = 'Pépiniériste' AND sho_city = 'Arras') emsup) 



Configuration: Windows / Chrome 90.0.4430.93

5 réponses

Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869
bonjour,
ce serait probablement plus clair si tu expliquais ce que tu essayais de réaliser.
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869
quel logiciel de base de données utilises-tu?
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

J'utilise phpmyadmin
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869 >
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

tu utiliserais donc mysql.
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

Oui donc, dans ma table employees j'ai tout les employés d'un commerce.
Dans leur attribue il on chacun un numéro correspondant à leurs supérieur le emp_superior_id et qui correspond lui à (emp_id) la personne en question.
Dans le set je sélectionne l'id de l'employé (emp_id) qui deviendra le emp_superior_id de ce sélectionné dans le where
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869 >
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

partons plutôt de cette requête:
SELECT r1.emp_id AS emp_superior_id, e.emp_id
FROM 
(SELECT t2.emp_id
FROM employees as t2
JOIN posts ON pos_id = t2.emp_pos_id 
JOIN shops ON sho_id = t2.emp_sho_id 
WHERE sho_city = 'Arras' AND pos_libelle LIKE 'Manager%'
HAVING MIN(emp_salary)) r1
JOIN  employees as e
JOIN posts ON pos_id = e.emp_pos_id 
JOIN shops ON sho_id = e.emp_sho_id 
WHERE pos_libelle = 'Pépiniériste' AND sho_city = 'Arras'
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
>
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021

La requête est bonne le résultat et toujours bon
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869 >
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

et cet UPDATE, dérivée de la requête SELECT en #40, cela donne quoi?:
UPDATE
(SELECT t2.emp_id
FROM employees as t2
JOIN posts ON pos_id = t2.emp_pos_id 
JOIN shops ON sho_id = t2.emp_sho_id 
WHERE sho_city = 'Arras' AND pos_libelle LIKE 'Manager%'
HAVING MIN(emp_salary)) r1
JOIN  employees as e
JOIN posts ON pos_id = e.emp_pos_id 
JOIN shops ON sho_id = e.emp_sho_id 
SET e.emp_superior_id = r1.emp_id
WHERE pos_libelle = 'Pépiniériste' AND sho_city = 'Arras'
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
>
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021

Le UPDATE fonctionne !
il ne me reste plus qu'a comparer mes erreurs et en tiré des explications..
Merci encore une fois yg_be de ton aide.
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
>
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021

Pour le update
La syntaxe n'est pas bonne en tout cas pour le update
UPDATE (SELECT t2.emp_id
FROM employees as t2
JOIN posts ON pos_id = t2.emp_pos_id 
JOIN shops ON sho_id = t2.emp_sho_id 
WHERE sho_city = 'Arras' AND pos_libelle LIKE 'Manager%'
HAVING MIN(emp_salary)) r1, (SELECT t.emp_id, t.emp_superior_id
                             FROM employees as t
                             JOIN posts ON pos_id = t.emp_pos_id 
                             JOIN shops ON sho_id = t.emp_sho_id 
                             WHERE pos_libelle = 'Pépiniériste' AND sho_city = 'Arras') r2
SET r1.emp_superior_id = r2.emp_id
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021
130
Hello,

C'est tout à fait possible de travailler sur la même table, il faut en revanche utiliser les alias.

UPDATE employees AS t1
INNER JOIN (
  SELECT emp_id
  FROM employees
  JOIN posts ON pos_id = emp_pos_id
  JOIN shops ON sho_id = emp_sho_id
  WHERE pos_libelle LIKE 'Manager%'
    AND sho_city = 'Arras'
  HAVING MIN(emp_salary)
  ) as t2
SET t1.emp_superior_id = t2.emp_id
WHERE t1.emp_id IN(SELECT emp_id
                FROM employees 
                JOIN posts ON pos_id = emp_pos_id                               
                JOIN shops ON sho_id = emp_sho_id 
                WHERE pos_libelle = 'Pépiniériste' AND sho_city = 'Arras') 


( non testé )

N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021
869 >
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

ce n'est pas bizarre, c'est la façon dont tu utilisais des sous-requêtes qui causait des erreurs.
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
>
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021

Je sais mntn que jusqu'à #6 il modifie tout le monde donc je dois trouvé le moyens de ne faire modifié que les Pépiniéristes de Arras.
J'ai pensé à une chose il aurait était plus simple d'affecter ces changements avant même que Amity ne soit officiellement en retraire et mettre le tout dans une transaction, comme on connait sont identité ?
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021
>
Messages postés
16120
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 juin 2021

CE CODE FONCTIONNE MAIS NORMALEMENT LES DONNEES emp_id sont inconnu
en sachant que ma requête seule donc en SELECT donne exactement ce résultat (20, 44, 57, 103) mais dans le where il ne fonctionne pas
UPDATE employees AS t1
INNER JOIN (SELECT emp_id
            FROM employees
            JOIN posts ON pos_id = emp_pos_id
            JOIN shops ON sho_id = emp_sho_id
            WHERE pos_libelle LIKE 'Manager%' AND sho_city = 'Arras'
            HAVING MIN(emp_salary)) as t2
SET t1.emp_superior_id = t2.emp_id
WHERE t1.emp_id IN (20, 44, 57, 103)
 

Je ne comprend où est l'erreur dans ma sous-requêtes
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021
130 >
Messages postés
54
Date d'inscription
samedi 3 avril 2021
Statut
Membre
Dernière intervention
8 mai 2021

Hello Hello,

Désolé, j'ai dû m'absenter du week-end!!
Bon, c'est cool si vous êtes arrivé à quelque chose !

Dans l'idée, j'avais ça en tête :
SET @DA_CITY = "Arres";
UPDATE employees AS d1
INNER JOIN (
    SELECT emp_id as cityManagerID, t1.sho_id as cityID
    FROM employees as t
    JOIN shops as t1 ON t1.sho_id = t.emp_sho_id
    JOIN posts as t2 ON t2.pos_id = t.emp_pos_id
    WHERE t2.pos_libelle LIKE 'Manager%'
      AND t1.sho_city = @DA_CITY
  ) as d2
SET d1.emp_superior_id = d2.cityManagerID
WHERE d1.emp_sho_id IN(d2.cityID)
  AND d1.emp_superior_id IS NOT NULL


C'est surement un peu perché, mais ça fait le taf :)

A plus dans l'bus
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021
130 >
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021

J'ai ajouté le HAVING que j'ai pas pu tester et j'ai modifier la façon de matcher les pepineristes seulement:
SET @DA_CITY = "Arras";
UPDATE employees AS d1
INNER JOIN (
    SELECT emp_id as cityManagerID, t1.sho_id as cityID, t3.pos_id as targetPepineriste
    FROM employees as t
    JOIN shops as t1 ON t1.sho_id = t.emp_sho_id
    JOIN posts as t2 ON t2.pos_id = t.emp_pos_id
    JOIN posts as t3
    WHERE t1.sho_city = @DA_CITY
      AND t2.pos_libelle LIKE 'Manager%'
      AND t3.pos_libelle = "Pépiniériste"
    HAVING MIN(t.emp_salary)
  ) as d2
WHERE d1.emp_sho_id IN(d2.cityID)
  AND d1.emp_pos_id = d2.targetPepineriste
Messages postés
1466
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 mai 2021
130
Le having doit étre modifié pour mettre
    HAVING MIN(t2.emp_salary)