Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL génère-t-elle une erreur « L'identifiant en plusieurs parties n'a pas pu être lié » et comment puis-je y remédier ?
Erreur de requête SQL : "Impossible de lier l'identifiant multipart"
Description du problème
Lors de l'exécution d'une requête SQL, j'ai rencontré l'erreur : "Impossible de lier l'identifiant multipart 'a.maxa'". Même après avoir divisé la requête en sous-requêtes distinctes, l'erreur persiste.
Voici un exemple de requête qui a mal tourné :
<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>
Raison de l'erreur
Cette erreur est causée par un mélange inapproprié de jointures explicites et de jointures implicites dans la requête. Les jointures explicites, exprimées avec le mot clé JOIN, ont priorité sur les jointures implicites (spécifiées à l'aide de virgules et d'une clause WHERE).
Dans la requête donnée, vous joignez explicitement les tables a et b, puis implicitement vous dkcd au résultat de cette jointure en utilisant la syntaxe LEFT OUTER JOIN. Cependant, cela rend la référence à a.maxa dans la clause ON invalide car a ne fait pas partie de la connexion explicite dkcd.
Solution
Pour résoudre ce problème, envisagez de réécrire la requête pour utiliser une syntaxe de jointure cohérente. Une solution possible est :
<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 modifiée, la jointure explicite est clairement définie et la référence à a.maxa est valide dans la condition ON. Comme Aaron Bertrand l'a suggéré, vous devez également spécifier l'alias a dans la clause ORDER BY pour éviter toute ambiguïté potentielle.
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!