Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O identificador de várias partes não pôde ser vinculado


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.