inner left right join da peste....
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.
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
Curtidas 0
Respostas
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__>
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
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__>
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
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
29/10/2005
Cara, tenta assim:
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???
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
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.
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
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.
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
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.
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
29/10/2005
Funcionou sim.
Qto ao tempo vou testar com os indices.
Brigadao pela ajuda.
Precisando tamos ai.
Qto ao tempo vou testar com os indices.
Brigadao pela ajuda.
Precisando tamos ai.
GOSTEI 0