Fórum select em 03 tabelas como fazer ? #366524
28/11/2008
0
A minha situação é a seguinte, preciso trazer informação de 03 tabelas
Clientes
Lancamentos
Atendimento (apenas o último)
Esta funcionando desta forma mas eu sei que a sintaxe esta errada:
select *.Cli, *.Lan, *. Atd from Clientes Cli, Lancamentos Lanc, Atd Atendimento where (cli.id_cliente = atd.id_cliente) and (cli.id_cliente = lanc.id_cliente) and DATA =:PDATA
Acontece duas coisas:
1. - Se não existe registro no atendimento ele não tras nenhum (devido ao clausula AND, se eu usar OR, fica mais bagunçado ainda...rs..rs)
2. - Não sei como fazer para trazer apenas o ultimo registro do atendimento, se o cliente tiver mais de um ele tras varias vezes o mesmo registro da quantidade de atendimento.
Se alguem suber como fazer de forma correta e postar o exemplo mas pratico possivel para eu entender, fico muito agradecido.
Obrigado.
Estou usando Delphi 7 + DBExpress + Firebir.
Badboysjc
Curtir tópico
+ 0Posts
29/11/2008
Badboysjc
UP
Gostei + 0
29/11/2008
Joaoshi
Gostei + 0
01/12/2008
Badboysjc
Caro amigo, antes de mais nada obrigado.
Segue abaixo a instrução SQL, neste caso esta com duas tabelas preciso buscar mais duas colunas de uma terceira TABELA, que são (DATA_ATENDIMENTO, DESCRICAO) na tabela ATENDIMENTO.
select lanc.filial_loja, lanc.colaborador, lanc.id_lancamento, Lanc.valor_solicitado, lanc.valor_parcela, lanc.plano, lanc.situacao_proposta, lanc.produto_banco, lanc.nome_da_tabela, lanc.consignataria,lanc.data_venda,lanc.id_codprod,Cli.CPF, Cli.Nome
from lancamentos Lanc, clientes Cli
where (lanc.id_cliente = cli.id_cliente) and data_venda between :DATA_VENDA and :DATA_VENDA1 and lanc.colaborador =:COLABORADOR and lanc.consignataria =:CONSIGNATARIA and lanc.filial_loja =:FILIAL_LOJA
Obrigado.
Gostei + 0
01/12/2008
Acacio
select *.Cli, *.Lan, *. Atd
from Clientes Cli
left join Lancamentos Lanc on cli.id_cliente = lanc.id_cliente
left join Atd Atendimento on cli.id_cliente = atd.id_cliente
where DATA =:PDATA
Gostei + 0
01/12/2008
Paulo
Do jeito que você colocou, isso é um INNER JOIN e logo, caso não haja ´coincidência´, não vai trazer nada mesmo. Outra coisa, eu sempre fiz assim:
Cli.* e não *.Cli. Bem a solução é:
1) Trazer somente os campos necessários à sua consulta, tipo:
Cli.Nome, Lanc.Dt_Lancamento e assim por diante, pois quando você faz Cli.* ou o inverso, está trazendo tudo. Use INNER, LEFT e etc... acho que descomplica mais.
select *.Cli, *.Lan, *. Atd from Clientes Cli, Lancamentos Lanc, Atd Atendimento where (cli.id_cliente = atd.id_cliente) and (cli.id_cliente = lanc.id_cliente) and DATA =:PDATA - seu código
select Cli.Campo, Lan.Campo, Atd.Campo from Clientes Cli LEFT OUTER JOIN Lancamentos Lanc(cli.id_cliente = lanc.id_cliente) LEFT OUTER JOIN Atd Atendimento (cli.id_cliente = Atd.id_cliente) WHERE DATA =:PDATA Order By Lanc.Dt_Ultimos_Lancamento DESC
Onde houver a palavra Campo, substituir pelo campo correspondente. Observe que eu usei LEFT e não INNER. Os LEFT são mais rápidos, já que é feita uma verificação apenas e você pode controlar usando Where, para trazer tudo da tabela esquerda que não seja necessário. Os INNER se verificam duas vezes. Se as tabelas são grandes, a query fica muito demorada. Eu pessoalmente já testei e já ganhei mais de 20min(Isso mesmo, vinte minutos) por query. Espero que te ajude, t+.
Gostei + 0
01/12/2008
Paulo
select Cli.Campo, Lan.Campo, Atd.Campo from Clientes Cli LEFT OUTER JOIN Lancamentos Lanc ON (cli.id_cliente = lanc.id_cliente) LEFT OUTER JOIN Atd Atendimento ON (cli.id_cliente = Atd.id_cliente) WHERE DATA =:PDATA Order By Lanc.Dt_Ultimos_Lancamento DESC
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)