Maison > base de données > tutoriel mysql > Pourquoi est-ce que j'obtiens l'erreur « L'identifiant en plusieurs parties n'a pas pu être lié » dans ma requête SQL et comment puis-je la corriger ?

Pourquoi est-ce que j'obtiens l'erreur « L'identifiant en plusieurs parties n'a pas pu être lié » dans ma requête SQL et comment puis-je la corriger ?

Mary-Kate Olsen
Libérer: 2025-01-17 03:42:10
original
311 Les gens l'ont consulté

Why am I getting the

Erreurs et solutions d'identifiant multi-parties SQL

Lors de la récupération et de la manipulation de données de base de données à l'aide de requêtes SQL, vous rencontrez souvent l'erreur « L'identifiant multipart ne peut pas être lié », ce qui est frustrant. Cet article abordera cette erreur et ses solutions pour vous aider à résoudre des problèmes similaires à l'avenir.

Erreur de compréhension

L'erreur « L'identifiant en plusieurs parties ne peut pas être lié » se produit généralement lorsqu'un identifiant en plusieurs parties (constitué d'un alias de table et d'un nom de colonne) est utilisé dans une requête mais n'est pas cité correctement. Cette situation se produit lorsque vous mélangez des jointures implicites (en utilisant des virgules dans la clause FROM) et des jointures explicites (en utilisant le mot clé JOIN) dans la même requête.

Utilisation mixte des jointures

Les jointures implicites sont moins explicites que les jointures explicites et sont souvent utilisées pour simplifier les requêtes. Toutefois, les jointures explicites ont priorité sur les jointures implicites. Cela signifie que si vous mélangez des jointures explicites et implicites dans une requête, les conditions de jointure explicites auront priorité, remplaçant éventuellement les conditions de jointure implicites.

Exemple de requête

Jetons un coup d'œil à l'exemple de requête fourni dans la question :

<code class="language-sql">SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a,
quanhuyen b
LEFT OUTER JOIN (
    SELECT maxa,
    COUNT(*) AS tong
    FROM khaosat
    WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
    AND 'Sep 5 2011'
    GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa  '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;</code>
Copier après la connexion

Dans cette requête, une jointure explicite entre 'b' et 'dkcd' utilisant la clause ON est prioritaire sur une jointure implicite entre 'a' et 'dkcd'. Cela rend la référence à « a.maxa » dans la clause ON invalide car « a » n'est pas encore joint à « dkcd » à ce stade.

Solution : Réécrire la requête

Pour résoudre cette erreur, réécrivez la requête afin d'utiliser des jointures explicites pour toutes les relations de table :

<code class="language-sql">SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
    SELECT maxa,
    COUNT(*) AS tong
    FROM khaosat
    WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
    AND 'Sep 5 2011'
    GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa  '99'
ORDER BY a.maxa;</code>
Copier après la connexion

Dans cette requête réécrite, la table 'a' est jointe à 'b' à l'aide d'un INNER JOIN explicite. Les résultats de cette jointure sont ensuite joints avec 'dkcd' en utilisant un LEFT OUTER JOIN explicite. Cela garantit que la référence à « a.maxa » dans la condition de jointure de dkcd est valide.

Notes supplémentaires

Il est à noter que dans la clause ORDER BY, il est préférable de qualifier la colonne 'maxa' à l'aide d'un alias de table car cela évite toute ambiguïté et erreurs potentielles (lorsqu'il y a plusieurs colonnes portant le même nom dans la requête). Dans cet exemple, la clause ORDER BY serait :

<code class="language-sql">ORDER BY a.maxa</code>
Copier après la connexion

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