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.