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

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

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.

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.

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!

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

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:

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  

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

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

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

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

o q esta errado no from por exemplo?

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

[quote=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:

[code]
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

[/code][/quote]

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

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)

[quote=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)[/quote]

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?

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