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.