Vi erros semelhantes no SO, mas não encontro uma solução para o meu problema. Eu tenho uma consulta SQL como:
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a ,
quanhuyen b
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'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
Quando executo essa consulta, o resultado do erro é:
O identificador de várias partes "a.maxa" não pôde ser vinculado. Por quê?
P / s: se eu dividir a consulta em 2 consultas individuais, execute ok.
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
e
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
sql
sql-server
sql-server-2005
PhamMinh
fonte
fonte
phuongxa
tabela inclui uma colunamaxa
?Respostas:
Você está misturando junções implícitas com junções explícitas. Isso é permitido, mas você precisa estar ciente de como fazer isso corretamente.
O fato é que as junções explícitas (aquelas implementadas usando a
JOIN
palavra - chave) têm precedência sobre as implícitas (as junções 'vírgula', em que a condição de junção é especificada naWHERE
cláusula).Aqui está um resumo da sua consulta:
Você provavelmente espera que ele se comporte da seguinte maneira:
isto é, a combinação de tabelas
a
eb
é associada à tabeladkcd
. De fato, o que está acontecendo éou seja, como você já deve ter entendido,
dkcd
é unida especificamente contrab
e somenteb
, o resultado da junção é combinadoa
e filtrado ainda mais com aWHERE
cláusula Nesse caso, qualquer referência aa
naON
cláusula é inválida ea
desconhecida nesse momento. É por isso que você está recebendo a mensagem de erro.Se eu fosse você, provavelmente tentaria reescrever esta consulta e uma solução possível seria:
Aqui o mesas
a
eb
são unidas em primeiro lugar, em seguida, o resultado está ligado adkcd
. Basicamente, essa é a mesma consulta que a sua, usando apenas uma sintaxe diferente para uma das junções, o que faz uma grande diferença: a referênciaa.maxa
nadkcd
condição de junção da agora é absolutamente válida.Como o @Aaron Bertrand observou corretamente, você provavelmente deve se qualificar
maxa
com um alias específico, provavelmentea
, naORDER BY
cláusula.fonte
ORDER BY maxa
, obrigado. Quanto às datas, acredito que foi assim que o OP optou por especificá-las em seu ambiente.Às vezes, esse erro ocorre quando você usa seu esquema (dbo) na sua consulta de maneira errada.
por exemplo, se você escrever:
você receberá o erro.
Nessas situações, altere-o para:
fonte
se você deu o nome dos aliados, mude para o nome real
por exemplo
mude isso para
fonte
Eu estava lutando com a mesma mensagem de erro no SQL SERVER, uma vez que eu tinha várias associações, alterando a ordem das associações que a resolveu para mim.
fonte
No meu caso, o problema acabou sendo o nome alternativo que eu havia dado à tabela. "oa" parece não ser aceitável para o SQL Server.
fonte
Eu estava tendo o mesmo erro do JDBC. Verifiquei tudo e minha consulta foi boa. Acabou que, na cláusula where, tenho uma discussão:
E o valor do argumento que eu estava passando era nulo. Isso também dá o mesmo erro que é enganoso, porque quando você pesquisa na Internet, acaba que algo está errado com a estrutura da consulta, mas não é o meu caso. Só pensei que alguém pode enfrentar o mesmo problema
fonte
O que funcionou para mim foi transformar minha cláusula WHERE em uma subconsulta SELECT
DE:
PARA:
fonte
Sou novo no SQL, mas deparei-me com esse problema em um curso que eu estava fazendo e descobriu que atribuir a consulta ao projeto especificamente ajudou a eliminar o erro de várias partes. Por exemplo, o projeto que eu criei foi o CTU SQL Project, por isso tive certeza de iniciar meu script com USE [CTU SQL Project] como minha primeira linha, como abaixo.
fonte
Se esse erro ocorrer em um
UPDATE
, verifiqueJOIN
novamente a tabela com a coluna / campo que está causando o erro.No meu caso, isso ocorreu devido à falta do
JOIN
próprio, que gerou o mesmo erro devido a um campo desconhecido (como Andriy apontou ).fonte
Em vez disso, você pode tentar ingressar em tabelas como,
Isso deve funcionar
fonte
fonte
Meu erro foi usar um campo que não existia na tabela.
table1.field1 => não existe
table2.field1 => está correto
Corrija o seu nome da tabela.
meu erro ocorreu por causa do uso de WITH
quando usado em junção com outras tabelas ...
fonte
Você esqueceu de participar de algumas mesas? Caso contrário, você provavelmente precisará usar alguns aliases.
fonte
Eu também estava lutando com esse erro e acabei com a mesma estratégia que a resposta. Estou incluindo minha resposta apenas para confirmar que esta é uma estratégia que deve funcionar.
Aqui está um exemplo em que eu faço primeiro uma junção interna entre duas tabelas que eu conheço obtém dados e, em seguida, duas junções externas deixadas em tabelas que podem ter linhas correspondentes que podem estar vazias. Você combina junções internas e externas para obter resultados com dados entre tabelas em vez de fazer a sintaxe separada por vírgula padrão entre tabelas e perder linhas na junção desejada.
Primeiro: faça as junções internas entre as tabelas que você espera que correspondam aos dados. Segunda parte: Continue com junções externas para tentar recuperar dados em outras tabelas, mas isso não filtrará seu conjunto de resultados se a junção externa da tabela não tiver dados correspondentes ou corresponder à condição configurada no predicado / condição on.
fonte
Este erro também pode ser causado pela falta de uma vírgula
,
entre os nomes das colunas na instrução SELECT.por exemplo:
fonte