J'ai ci-dessous la requête dans mysql où je veux vérifier si id de branche et année de finance tapez debranch_mastersont égaux à id de branche et année demanagerpuis mise à jour du statut dansmanagertable contre id de branche inmanager
UPDATE manager as m1
SET m1.status = 'Y'
WHERE m1.branch_id IN (
SELECT m2.branch_id FROM manager as m2
WHERE (m2.branch_id,m2.year) IN (
(
SELECT DISTINCT branch_id,year
FROM `branch_master`
WHERE type = 'finance'
)
)
)
mais obtenir une erreur
La table 'm1' est spécifiée deux fois, à la fois comme cible pour 'UPDATE' et comme source séparée pour les données
Ceci est typique de MySQL et peut généralement être contourné en sélectionnant dans le tableau dérivé, c’est-à-dire au lieu de
FROM manager AS m2
utilisation
FROM (select * from manager) AS m2
La déclaration complète:
UPDATE manager
SET status = 'Y'
WHERE branch_id IN
(
select branch_id
FROM (select * from manager) AS m2
WHERE (branch_id, year) IN
(
SELECT branch_id, year
FROM branch_master
WHERE type = 'finance'
)
);
Essayez :::
UPDATE manager as m1
SET m1.status = 'Y'
WHERE m1.branch_id IN (
(SELECT DISTINCT branch_id
FROM branch_master
WHERE type = 'finance'))
AND m1.year IN ((SELECT DISTINCT year
FROM branch_master
WHERE type = 'finance'))
Essayez d'utiliser l'opérateur EXISTS
:
UPDATE manager as m1
SET m1.status = 'Y'
WHERE EXISTS (SELECT 1
FROM (SELECT m2.branch_id
FROM branch_master AS bm
JOIN manager AS m2
WHERE bm.type = 'finance' AND
bm.branch_id = m2.branch_id AND
bm.year = m2.year) AS t
WHERE t.branch_id = m1.branch_id);
Remarque: La requête utilise un niveau d'imbrication supplémentaire, proposé par @Thorsten, pour contourner l'erreur la table est spécifiée deux fois} _.