Fórum inner left right join da peste.... #301163

29/10/2005

0

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

Responder

Posts

29/10/2005

Jrtupa2

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__>


Responder

Gostei + 0

29/10/2005

Jrtupa2

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__>


Responder

Gostei + 0

30/10/2005

Xisto

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.


Responder

Gostei + 0

31/10/2005

Firekiller

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???


Responder

Gostei + 0

01/11/2005

Xisto

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


Responder

Gostei + 0

01/11/2005

Firekiller

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.


Responder

Gostei + 0

01/11/2005

Firekiller

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.


Responder

Gostei + 0

01/11/2005

Xisto

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


Responder

Gostei + 0

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

Aceitar