Maison > base de données > tutoriel mysql > Comment résoudre l'erreur « Table spécifiée deux fois » dans MySQL lors de l'utilisation de sous-requêtes ?

Comment résoudre l'erreur « Table spécifiée deux fois » dans MySQL lors de l'utilisation de sous-requêtes ?

Mary-Kate Olsen
Libérer: 2024-11-12 15:02:02
original
510 Les gens l'ont consulté

How to Resolve the

Erreur MySQL : table spécifiée deux fois

Lorsque vous tentez de mettre à jour une table tout en l'utilisant également comme source de données, MySQL peut émettre une erreur indiquant que la table est spécifiée deux fois. Cela se produit généralement lors de l'utilisation de sous-requêtes avec alias de table.

Par exemple, considérons la requête suivante :

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'
  )
);
Copier après la connexion

Cette requête tente de mettre à jour la table du gestionnaire en fonction d'une sous-requête qui vérifie si certains champs dans le gestionnaire, faites correspondre les valeurs de la table branch_master où le type est « finance ». Cependant, MySQL s'oppose au fait que la table du gestionnaire soit utilisée à la fois comme cible (dans la clause UPDATE) et comme source de données (dans la sous-requête).

Pour résoudre ce problème et éviter que la "Table soit spécifié deux fois", nous pouvons utiliser une table dérivée pour la sous-requête. Cela implique de créer une table temporaire basée sur la table d'origine, puis de sélectionner dans cette table dérivée :

FROM (SELECT * FROM manager) AS m2
Copier après la connexion

En mettant la table du gestionnaire d'origine entre parenthèses et en alias le résultat comme m2, nous créons une nouvelle table dérivée. Cela nous permet de sélectionner des données de la table du gestionnaire sans spécifier explicitement deux fois le nom du gestionnaire.

Requête mise à jour :

UPDATE manager
SET status = 'Y'
WHERE branch_id IN (
  SELECT branch_id
  FROM (SELECT * FROM manager) AS m2
  WHERE (m2.branch_id, m2.year) IN (
    SELECT branch_id, year
    FROM branch_master
    WHERE type = 'finance'
  )
);
Copier après la connexion

Cette requête mise à jour utilise correctement une table dérivée pour la sous-requête, résolvant le Erreur "La table est spécifiée deux fois" et permettant à la requête de s'exécuter avec succès.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal