sql >> Base de Datos >  >> RDS >> Sqlserver

El identificador de varias partes no se pudo vincular

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.