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 ?

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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-17 03:37:08366parcourir

Why Does My SQL Query Result in a

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!

Déclaration:
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