[RESOLVIDO] LEFT JOIN .. qual o erro na minha query?

16 respostas
C

nao uso muitos joins porem nessa consulta eh extremamente necessario… porem esta acusando erro de sintaxe… alguem consegue identificar algum erro no trecho ai em baixo?

obs: é sql sim

a query completa esta aqui

SELECT clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade AS Cidade, clientes.fone, clientes.celular, MAX(Pedidos.Data_do_pedido) AS UltimoPedido, MAX(Pedidos.Valor_total) AS ValorUltimoPedido, Clientes.Numero, Clientes.Complemento

from temp,  cidades INNER JOIN clientes ON ( cidades.codigo_da_cidade = clientes.codigo_da_cidade)   LEFT JOIN pedidos ON (Pedidos.codigo_do_cliente = clientes.codigo_do_cliente)

WHERE clientes.codigo_da_cidade = temp.filtra_por_cidade
GROUP BY clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade, clientes.fone, clientes.celular, Clientes.Numero, Clientes.Complemento
ORDER BY cidades.Nome_da_cidade, clientes.bairro;
from temp, cidades INNER JOIN clientes ON ( cidades.codigo_da_cidade = clientes.codigo_da_cidade) LEFT JOIN pedidos ON (Pedidos.codigo_do_cliente = clientes.codigo_do_cliente)

resumindo o que quero fazer… :

fazer uma lista dos clientes da cidade que eu mando no temp… e se existir pedido para aquele cliente… trazer o valor do ultimo pedido e a data

abrass

16 Respostas

maior_abandonado

só para confirmar, isso dai é sql que você está colando né?? não é hql não né?

poste sua query completa, não só uma parte dela… e se possivel a estrutura das tabelas envolvidas.

romarcio

Um erra acho que é depois do FROM. Você deve colocar uma unica tabela e colocou duas (temp e cidades)
E outro pode ser os parenteses, não tenho certeza, mas acho que eles não devem ser usados.

leoramos

Considerando que tu não colou o select, a pergunta faz sentido: tá tentando fazer isso em HQL? Parece SQL, mas numa dessas…
Confere teus alias, também.
Que “temp” eh aquela?
Tua pergunta e a explicação não estão muito boas… especifica mais, cara.
Abraço!

C

coloquei a query completa lah em cima agora… e mais alguns detalhes… abrass

rodrigocolasso

Clauslk,

trabalhar com join é uma tarefa muito fácil, facilita mais ainda saber o que você realmente quer.

Será que você poderia ser mais claro?

Quando você coloca “FROM temp, cidades”, o que você quer dizer? Esse trecho é como você faria um join antigamente (ou seja nào é mais usado).

Posta o que você quer certinho que a gente te ajuda. :smiley:

P

fazer uma lista dos clientes da cidade que eu mando no temp… e se existir pedido para aquele cliente… trazer o valor do ultimo pedido e a data

É mais ou menos assim…

SELECT clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade AS Cidade, clientes.fone, clientes.celular, Pedidos.Data_do_pedido as ultimo , Pedidos.Valor_total  AS ValorUltimoPedido, Clientes.Numero, Clientes.Complemento  
      
    from temp,  cidades INNER JOIN clientes ON ( cidades.codigo_da_cidade = clientes.codigo_da_cidade)   
LEFT JOIN pedidos ON (Pedidos.codigo_do_cliente = clientes.codigo_do_cliente)  
where Pedidos.Data_do_pedido = (select MAX(Pedidos.Data_do_pedido) AS UltimoPedido where Pedidos.codigo_do_cliente = clientes.codigo_do_cliente and clientes.codigo_da_cidade = temp.filtra_por_cidade)
and Pedidos.Valor_total = (select MAX(Pedidos.Valor_total) AS ValorUltimoPedido Pedidos.codigo_do_cliente = clientes.codigo_do_cliente and clientes.codigo_da_cidade = temp.filtra_por_cidade)
and  clientes.codigo_da_cidade = temp.filtra_por_cidade
C

cara eu estava pesquisando como usar os joins…e entendi mais ou menos como funciona porem esta acusando um erro ainda … dizendo ‘sem suporte a expressao de associacao’ … mas acredito que seja da ferramenta que estou usando… no caso para este projeto é access… veja a sql abaixo e me diga se encontra algo de errado… acredito q agora esta mais clara pra vcs…

SELECT

 clientes.nome,
 clientes.endereco, 
 clientes.bairro ,
 cidades.nome_da_cidade AS Cidade,
 clientes.fone, 
 clientes.celular,
 MAX(Pedidos.Data_do_pedido) AS UltimoPedido,
 MAX(Pedidos.Valor_total) AS ValorUltimoPedido,
 Clientes.Numero,
 Clientes.Complemento

FROM

cidades  INNER JOIN clientes ON cidades.codigo_da_cidade = clientes.codigo_da_cidade ,
clientes  LEFT JOIN pedidos ON  Pedidos.codigo_do_cliente = clientes.codigo_do_cliente ,
temp

WHERE clientes.codigo_da_cidade = temp.filtra_por_cidade

GROUP BY clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade, clientes.fone, clientes.celular, Clientes.Numero, Clientes.Complemento
ORDER BY cidades.Nome_da_cidade, clientes.bairro;

obrigado pela atencao… abrass

rodrigocolasso

Hum é que a sintaxe do join não esta correta, muda isso e veja o que da :wink:

Depois do from você coloca sua tabela principal, aquela que você quer buscar. Para adicionar um join você coloca assim:

Ex:

select * 
 from produto
 inner join categoria on (produto.idCategoria = categoria.idCategoria)

Quanto ao qual tipo de join usar, isso depente, pode ser inner, left e right
C

tava pesquisando mais um pouco aqui… e cheguei a solucao

SELECT

 clientes.nome,
 clientes.endereco, 
 clientes.bairro ,
 cidades.nome_da_cidade AS Cidade,
 clientes.fone, 
 clientes.celular,
 MAX(Pedidos.Data_do_pedido) AS UltimoPedido,
 MAX(Pedidos.Valor_total) AS ValorUltimoPedido,
 Clientes.Numero,
 Clientes.Complemento

FROM (cidades INNER JOIN clientes ON cidades.codigo_da_cidade = clientes.codigo_da_cidade)  LEFT JOIN  pedidos ON pedidos.codigo_do_cliente = clientes.codigo_do_cliente

where 

clientes.codigo_da_cidade = ( select temp.filtra_por_cidade from temp )

GROUP BY clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade, clientes.fone, clientes.celular, Clientes.Numero, Clientes.Complemento
ORDER BY cidades.Nome_da_cidade, clientes.bairro;

usei uma sub consulta para retornar o filtro de temp no where… pois nao estava me permitindo colocar a tabela temp no from

obs… temp eh uma tabela usada para guardar informacoes temporarias para relatorio ou algo do genero

abrass… vo colococar o topico como resolvido

rodrigocolasso

Blz, mas continuo repetindo teu from está errado, não que não funcione, mas ta errado.

C

o q esta errado no from por exemplo?

rodrigocolasso

O que eu tinha falado acima, que agora está aqui em baixo :

rodrigocolasso:
Hum é que a sintaxe do join não esta correta, muda isso e veja o que da :wink:

Depois do from você coloca sua tabela principal, aquela que você quer buscar. Para adicionar um join você coloca assim:

Ex:

select * 
 from produto
 inner join categoria on (produto.idCategoria = categoria.idCategoria)

Quanto ao qual tipo de join usar, isso depente, pode ser inner, left e right
C

mudei novamente a query … esta assim agora…

coloquei a tabela temp no inner join com cidades…

SELECT

 clientes.nome,
 clientes.endereco, 
 clientes.bairro ,
 cidades.nome_da_cidade AS Cidade,
 clientes.fone, 
 clientes.celular,
 MAX(Pedidos.Data_do_pedido) AS UltimoPedido,
 MAX(Pedidos.Valor_total) AS ValorUltimoPedido,
 Clientes.Numero,
 Clientes.Complemento

FROM

  ((temp INNER JOIN cidades ON cidades.codigo_da_cidade = temp.filtra_por_cidade)  INNER JOIN clientes ON cidades.codigo_da_cidade = clientes.codigo_da_cidade) LEFT JOIN  pedidos ON pedidos.codigo_do_cliente = clientes.codigo_do_cliente

GROUP BY clientes.nome, clientes.endereco, clientes.bairro, cidades.Nome_da_cidade, clientes.fone, clientes.celular, Clientes.Numero, Clientes.Complemento
ORDER BY cidades.Nome_da_cidade, clientes.bairro;

abrass

rodrigocolasso

Blz, eu só mudaria isso:

from temp INNER JOIN cidades ON (cidades.codigo_da_cidade = temp.filtra_por_cidade) INNER JOIN clientes ON (clientes.codigo_da_cidade = cidades.codigo_da_cidade) LEFT JOIN pedidos ON (pedidos.codigo_do_cliente = clientes.codigo_do_cliente)

C

rodrigocolasso:
Blz, eu só mudaria isso:

from temp INNER JOIN cidades ON (cidades.codigo_da_cidade = temp.filtra_por_cidade) INNER JOIN clientes ON (clientes.codigo_da_cidade = cidades.codigo_da_cidade) LEFT JOIN pedidos ON (pedidos.codigo_do_cliente = clientes.codigo_do_cliente)

porem desta forma nao funciona … acusa falta de operador… na query q eu postei antes… os parenteses que juntam os dois inner joins para usar como result set do left join… nao é isso?

rodrigocolasso

Ta pode colocar os parenteses nos inner join, mas deveria funcionar…

Criado 22 de julho de 2011
Ultima resposta 22 de jul. de 2011
Respostas 16
Participantes 6