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>
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>
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>
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!