Está mezclando uniones implícitas con uniones explícitas. Eso está permitido, pero debe saber cómo hacerlo correctamente.
La cuestión es que las uniones explícitas (las que se implementan usando JOIN
palabra clave) tienen prioridad sobre las implícitas (las uniones de 'coma', donde la condición de unión se especifica en WHERE
cláusula).
Este es un resumen de su consulta:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Probablemente esté esperando que se comporte así:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
es decir, la combinación de tablas a
y b
se une con la tabla dkcd
. De hecho, lo que está pasando es
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
es decir, como ya habrás entendido, dkcd
se une específicamente contra b
y solo b
, luego el resultado de la unión se combina con a
y filtrado aún más con WHERE
cláusula. En este caso, cualquier referencia a a
en el ON
la cláusula no es válida, a
se desconoce en ese momento. Es por eso que recibe el mensaje de error.
Si yo fuera usted, probablemente intentaría reescribir esta consulta y una posible solución podría ser:
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
Aquí las tablas a
y b
se unen primero, luego el resultado se une a dkcd
. Básicamente, esta es la misma consulta que la tuya, solo que usa una sintaxis diferente para una de las uniones, lo que hace una gran diferencia:la referencia a.maxa
en el dkcd
La condición de unión de ahora es absolutamente válida.
Como @Aaron Bertrand ha señalado correctamente, probablemente debería calificar maxa
con un alias específico, probablemente a
, en el ORDER BY
cláusula.