Fórum inner left right join da peste.... #301163
29/10/2005
0
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
Curtir tópico
+ 0Posts
29/10/2005
Jrtupa2
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
29/10/2005
Jrtupa2
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
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.
Gostei + 0
31/10/2005
Firekiller
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
01/11/2005
Xisto
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
01/11/2005
Firekiller
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
01/11/2005
Firekiller
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
01/11/2005
Xisto
Qto ao tempo vou testar com os indices.
Brigadao pela ajuda.
Precisando tamos ai.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)