Maison >base de données >tutoriel mysql >Pourquoi ne puis-je pas utiliser un alias de colonne dans une sous-requête de clause WHERE MySQL ?

Pourquoi ne puis-je pas utiliser un alias de colonne dans une sous-requête de clause WHERE MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-22 08:12:11415parcourir

Why Can't I Use a Column Alias in a MySQL WHERE Clause Subquery?

Sous-requête de clause MySQL WHERE : problème d'alias de colonne et solution

L'utilisation d'un alias de colonne dans une sous-requête de clause MySQL WHERE entraîne souvent des erreurs telles que "#1054 - Colonne inconnue 'code postal_garanti' dans 'sous-requête IN/ALL/ANY'." Cela résulte de la tentative de filtrer les résultats en fonction d'un alias (guaranteed_postcode dans ce cas) avant qu'il ne soit réellement défini par la requête.

Scénario de problème :

Le scénario typique implique une requête joignant des tables (par exemple, « utilisateurs » et « emplacements ») et créant une nouvelle colonne (comme guaranteed_postcode à partir d'une sous-chaîne de la colonne « brute »). La tentative ultérieure de filtrage à l'aide de cet alias nouvellement créé dans une sous-requête de clause WHERE échoue.

Pourquoi ça échoue :

MySQL traite la clause WHERE avant de résoudre les alias. Par conséquent, l'alias guaranteed_postcode est inconnu au moment de l'exécution de la clause WHERE. Cette limitation est conforme aux normes SQL.

Conformité aux normes SQL :

MySQL, adhérant aux normes SQL, restreint l'utilisation d'alias de colonne dans les clauses WHERE. Les alias sont correctement utilisés dans les clauses GROUP BY, ORDER BY et HAVING.

Solution efficace utilisant HAVING :

La solution recommandée consiste à utiliser la clause HAVING. HAVING est conçu pour filtrer les données agrégées, mais il peut gérer efficacement cette situation. Voici comment réécrire la requête :

<code class="language-sql">HAVING `guaranteed_postcode` NOT IN (
  SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia')
)</code>

Cette approche garantit que l'alias guaranteed_postcode est évalué après la création de la colonne, résolvant ainsi l'erreur. La clause HAVING filtre correctement les résultats en fonction de la condition souhaitée.

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!

Déclaration:
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