Maison > base de données > tutoriel mysql > Pourquoi ma requête SQL génère-t-elle une erreur « L'identifiant multi-parties n'a pas pu être lié » ?

Pourquoi ma requête SQL génère-t-elle une erreur « L'identifiant multi-parties n'a pas pu être lié » ?

Susan Sarandon
Libérer: 2025-01-17 03:46:11
original
705 Les gens l'ont consulté

Why Does My SQL Query Produce a

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>
Copier après la connexion

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>
Copier après la connexion

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!

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