Você está misturando junções implícitas com junções explícitas. Isso é permitido, mas você precisa estar ciente de como fazer isso corretamente.
A coisa é, junções explícitas (aquelas que são implementadas usando o
JOIN palavra-chave) têm precedência sobre as implícitas (as junções de 'vírgula', onde a condição de junção é especificada no WHERE cláusula). Aqui está um esboço de sua consulta:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Você provavelmente está esperando que ele se comporte assim:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
ou seja, a combinação de tabelas
a e b é unido com a tabela dkcd . Na verdade, o que está acontecendo é SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
ou seja, como você já deve ter entendido,
dkcd é unido especificamente contra b e apenas b , então o resultado da junção é combinado com a e filtrado ainda mais com o WHERE cláusula. Nesse caso, qualquer referência a a no ON cláusula é inválida, a é desconhecido naquele momento. É por isso que você está recebendo a mensagem de erro. Se eu fosse você, provavelmente tentaria reescrever essa consulta e uma solução possível seria:
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
Aqui as tabelas
a e b são unidos primeiro, então o resultado é unido ao dkcd . Basicamente, esta é a mesma consulta que a sua, apenas usando uma sintaxe diferente para uma das junções, o que faz uma grande diferença:a referência a.maxa no dkcd A condição de junção de agora é absolutamente válida. Como @Aaron Bertrand observou corretamente, você provavelmente deve qualificar
maxa com um alias específico, provavelmente a , em ORDER BY cláusula.