Fórum select em 03 tabelas como fazer ? #366524

28/11/2008

0

Bom Dia !!

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

Badboysjc

Responder

Posts

29/11/2008

Badboysjc

Bom Dia !! 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.


UP


Responder

Gostei + 0

29/11/2008

Joaoshi

Você poderia informar as colunas que deveriam ser retornadas da sua consulta ?


Responder

Gostei + 0

01/12/2008

Badboysjc

Você poderia informar as colunas que deveriam ser retornadas da sua consulta ?


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.


Responder

Gostei + 0

01/12/2008

Acacio

Não sei se entendi direito, mas tenta assim:

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


Responder

Gostei + 0

01/12/2008

Paulo

Para trazer os últimos registros é só dar um Order By descrente.

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+.


Responder

Gostei + 0

01/12/2008

Paulo

Correção, faltou os ON.

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



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar