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
Libérer: 2025-01-17 03:37:08
original
359 Les gens l'ont consulté

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

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

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!

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