Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

L'identifiant en plusieurs parties n'a pas pu être lié

Vous mélangez des jointures implicites avec des jointures explicites. C'est autorisé, mais vous devez savoir comment le faire correctement.

Le fait est que les jointures explicites (celles qui sont implémentées en utilisant le JOIN mot clé) ont priorité sur les valeurs implicites (les jointures 'virgule', où la condition de jointure est spécifiée dans WHERE clause).

Voici un aperçu de votre requête :

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

Vous vous attendez probablement à ce qu'il se comporte comme ceci :

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

c'est-à-dire la combinaison de tables a et b est joint à la table dkcd . En fait, ce qui se passe est

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

c'est-à-dire, comme vous l'avez peut-être déjà compris, dkcd est joint spécifiquement contre b et seulement b , alors le résultat de la jointure est combiné avec a et filtré davantage avec WHERE clause. Dans ce cas, toute référence à a dans le ON la clause n'est pas valide, a est inconnue à ce moment-là. C'est pourquoi vous obtenez le message d'erreur.

Si j'étais vous, j'essaierais probablement de réécrire cette requête, et une solution possible pourrait être :

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

Ici les tableaux a et b sont joints en premier, puis le résultat est joint à dkcd . En gros, il s'agit de la même requête que la vôtre, en utilisant uniquement une syntaxe différente pour l'une des jointures, ce qui fait une grande différence :la référence a.maxa dans le dkcd La condition de jointure de est maintenant absolument valide.

Comme @Aaron Bertrand l'a correctement noté, vous devriez probablement qualifier maxa avec un alias spécifique, probablement a , dans le ORDER BY clause.