web-dev-qa-db-fra.com

La table est spécifiée deux fois, à la fois comme cible pour 'UPDATE' et comme source séparée pour les données dans mysql

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

18
hrishi

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'
  )
);
45
Thorsten Kettner

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'))
1
PrinceKayastha

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} _.

Démo ici

1
Giorgos Betsos