Résolution de l'erreur « L'identifiant multipart ne peut pas être lié »
L'erreur de requête SQL « L'identifiant multipart 'a.maxa' ne peut pas être lié » indique un conflit lors du mélange de jointures implicites et explicites. Voici une explication détaillée :
Mélanger les jointures implicites et explicites
Dans la requête fournie, les jointures implicites (tables séparées par des virgules) et les jointures explicites (mot-clé JOIN) sont utilisées. Bien que cela soit autorisé, cela doit être traité avec précaution pour éviter des problèmes contraignants.
Comprendre les priorités de connexion
Les connexions explicites ont priorité sur les connexions implicites. Cela signifie que les jointures spécifiées à l'aide du mot-clé JOIN seront effectuées avant les jointures implicites.
Référence d'alias invalide
Dans votre requête, vous essayez d'effectuer une jointure implicite entre les résultats d'une jointure explicite entre les tables a et b et une autre table dkcd. Cependant, en raison de la priorité des jointures explicites, la table a n'est pas disponible lorsque vous essayez de référencer a.maxa à l'aide de la clause ON de dkcd. C'est de là que vient le message d'erreur.
Requête de réécriture
Pour résoudre ce problème, vous devez réécrire la requête en utilisant une syntaxe de jointure cohérente. Une solution possible consiste simplement à utiliser des jointures explicites :
<code class="language-sql">SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa AS a INNER JOIN quanhuyen AS b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN '2011年9月1日' and '2011年9月5日' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa '99' ORDER BY a.maxa;</code>
Dans cette requête, toutes les jointures sont explicites et les noms de tables sont qualifiés à l'aide d'alias dans tous les cas. Cela garantit que la référence à a.maxa dans la clause ON de dkcd est valide.
Explication sur la clause ORDER BY
Comme suggéré par @Aaron Bertrand, il est recommandé de qualifier maxa avec un alias spécifique a dans la clause ORDER BY :
<code class="language-sql">ORDER BY a.maxa;</code>
Cela garantit que le tri est effectué sur la bonne colonne. Le format de la date a également été ajusté pour le rendre plus facile à comprendre.
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!