inner left right join da peste....

Delphi

29/10/2005

Como meus neurorios ja entraram em colapso, peco socorro a cumunidade.
Volta e meia eu apanho da clausula JOIN

Tenho tres tabelas
DEBITOS
Debito Char 8
Cliente char 6
Loja char 2
vencimento,valor,dataPagamento,etc.

CLIENTES
cliente char 6
nome char 40
end,tel,etc.

INFORMACAO
cliente char 6
loja char 2
DatadoSPC date
reg boolean (se esta registrado no SPC ou nao)

Agora a brincadeira é o seguinte, preciso listar todos os DEBITOS de determinado periodo e de determinada loja agrupado por cliente ordenado pela prestacao mais vencida:

DEBITO.CODIGODOCLIENTE
CLIENTE.NOMEDOCARA
DEBITO.NUMERODEPRESTACOESVENCIDAS(cada reg é uma prestacao)
DEBITO.VALORTOTADASPRESTACOESVENCIDAS
INFORMACAO.DATADOSPC
INFORACAO.REG (True, False ou null)

Agora existem casos em que o cliente nao tem INFORMACAO de credito,
mas msm assim preciso que seja relacionado o debito (no INNER JOIN nao rola e no LEFT/RIGHT JOIN trava)
Opcao do relatorio: Posso listar os clientes registrados (INFORMACAO.REG is true) ou nao.

Nao parece dificil mas ja quebrei tanto a cabeca que nao sei mais o que fazer.


Xisto

Xisto

Curtidas 0

Respostas

Jrtupa2

Jrtupa2

29/10/2005

Muito estranho estar travando quando voce faz o left join.. qual banco é?

Vou passar para voce um exemplo de Left Join, ok

select
C.cliente,
C.nome,
I.DatadoSPC,
D.valor,
D.vencimento

from cliente C
left join informacao I on C.cliente = I.cliente
left join debitos D on C.cliente = D.cliente
where C.cliente between ´000001´ and ´999999´
order by C.cliente

As tabelas relacionadas pelo Left Join podem resultar registro ou nao, porém, não irá impedir com que os dados do cliente seja listado.

Se fosse Inner Join, só traria resultado caso o registro do cliente esteja em todas as tabelas, ok.

Voce podera fazer um Select direto na tabela de Debitos, ex:

select
D.vencimento,
D.valor,
C.nome
from debitos D
left join cliente C on D.cliente = C.cliente
where C.cliente = ´000123´

<__JR__>


GOSTEI 0
Jrtupa2

Jrtupa2

29/10/2005

Muito estranho estar travando quando voce faz o left join.. qual banco é?

Vou passar para voce um exemplo de Left Join, ok

select
C.cliente,
C.nome,
I.DatadoSPC,
D.valor,
D.vencimento

from cliente C
left join informacao I on C.cliente = I.cliente
left join debitos D on C.cliente = D.cliente
where C.cliente between ´000001´ and ´999999´
order by C.cliente

As tabelas relacionadas pelo Left Join podem resultar registro ou nao, porém, não irá impedir com que os dados do cliente seja listado.

Se fosse Inner Join, só traria resultado caso o registro do cliente esteja em todas as tabelas, ok.

Voce podera fazer um Select direto na tabela de Debitos, ex:

select
D.vencimento,
D.valor,
C.nome
from debitos D
left join cliente C on D.cliente = C.cliente
where C.cliente = ´000123´

<__JR__>


GOSTEI 0
Xisto

Xisto

29/10/2005

Voce podera fazer um Select direto na tabela de Debitos, ex:

select
D.vencimento,
D.valor,
C.nome
from debitos D
left join cliente C on D.cliente = C.cliente
where C.cliente = ´000123´ 

Funcionou mas demorou uma eternidade.
Assim o resultado foi instantaneo:

select
D.pkdebito,
D.venc,
D.valordeb,
C.nome
from debitos D, clientes C
where D.pkcliente = C.pkcliente


select
C.cliente,
C.nome,
I.DatadoSPC,
D.valor,
D.vencimento

from cliente C
left join informacao I on C.cliente = I.cliente
left join debitos D on C.cliente = D.cliente
where C.cliente between ´000001´ and ´999999´
order by C.cliente 

Esse travou.

Acredito que o correto seja FROM DEBITOS D pois é a tabela onde tudo deve ser listado, sendo complementado pelas informacoes das tabelas de CLIENTES e INFCRED.

De qqer forma agradeco sua ajuda, se tiver mais alguma idéia me diga, afinal e um simples SELECT entre tres tabelas relacionadas. Nao pode ser tão dificil.


GOSTEI 0
Firekiller

Firekiller

29/10/2005

Cara, tenta assim:

SELECT 
  D.DEBITO,
  D.CLIENTE,
  C.NOME AS NOME_CLIENTE,
  D.LOJA,
  D.VENCIMENTO,
  D.VALOR,
  I.DATADOSPC,
  I.REG
FROM 
  DEBITOS D
LEFT OUTER JOIN CLIENTES C ON (C.CLIENTE = D.CLIENTE)
LEFT OUTER JOIN INFORMACAO I ON (I.CLIENTE = D.CLIENTE AND I.LOJA = D.LOJA)
WHERE 
  (D.VENCIMENTO >= :DATA_INICIAL AND D.VENCIMENTO <= :DATA_FINAL) AND 
  D.LOJA = :LOJA
GROUP BY 
  D.CLIENTE
ORDER BY 
 D.CLIENTE, D.VENCIMENTO 


Crie alguns índices (se não existirem) para os campos D.Cliente, D.Vencimento, D.Loja.

Outra coisa, você não informou qual banco tá usando, portanto a sintaxe do SQL pode mudar. Qual banco usa???


GOSTEI 0
Xisto

Xisto

29/10/2005

[b:52130af038]firekiller[/b:52130af038] ja agradeco pela ajuda.
bom em 87500 registros, sem qqer indice (nunca tive necessidade de usar para melhorar performance ou algo do genero) em um banco Firebird (que tenho gostado muito) levou 31 segundos pra dar o retorno.
Mas pelo menos nao travou. :)
Serio msm, vou tentar isso de outra forma.


GOSTEI 0
Firekiller

Firekiller

29/10/2005

Mas então resolveu seu problema ??

Faça o seguinte, se o problema for apenas o tempo, crie os índices que te falei antes, e veja o que acontece.


GOSTEI 0
Firekiller

Firekiller

29/10/2005

Mas então resolveu seu problema ??

Faça o seguinte, se o problema for apenas o tempo, crie os índices que te falei antes, e veja o que acontece.


GOSTEI 0
Xisto

Xisto

29/10/2005

Funcionou sim.
Qto ao tempo vou testar com os indices.
Brigadao pela ajuda.
Precisando tamos ai.


GOSTEI 0
POSTAR