[firebase-br] SQL LEFT JOIN

Paulo Geloramo assisinformatica em gmail.com
Qua Jun 6 13:30:29 -03 2018


Fiz a EXCUTE BLOCK abaixo que esta executando no
IBExpert e retornando o resultado correto, mas no
DBX retorna o erro: undefined message number.


====
EXECUTE BLOCK RETURNS(
  CODIGO_PONTO INTEGER,
  NOME_PONTO VARCHAR(30),
  CODIGO_PRODUTO INTEGER,
  CODIGOF_PRODUTO INTEGER,
  NOME_PRODUTO VARCHAR(30),
  REMESSA INTEGER,
  DEVOLUCAO INTEGER,
  VENDA INTEGER,
  ESTOQUE INTEGER)
AS
BEGIN
  FOR SELECT T.CODIGO_PONTO, T.NOME_PONTO, P.CODIGO_PRODUTO,
P.CODIGOF_PRODUTO, P.NOME_PRODUTO,
      COALESCE(SUM(I.QUANTIDADE), 0)
      FROM NOTA_PONTO_ITEM I
      JOIN PONTO T ON T.ID_PONTO = I.ID_PONTO
      JOIN EDICAO E ON E.ID_EDICAO = I.ID_EDICAO
      JOIN PRODUTO P ON P.ID_PRODUTO = E.ID_PRODUTO
      JOIN ASSUNTO A ON A.ID_ASSUNTO = P.ID_ASSUNTO
      WHERE A.CODIGO_ASSUNTO = 10
      GROUP BY T.CODIGO_PONTO, T.NOME_PONTO, P.CODIGO_PRODUTO,
P.CODIGOF_PRODUTO, P.NOME_PRODUTO
      ORDER BY T.CODIGO_PONTO, P.NOME_PRODUTO
      INTO CODIGO_PONTO, NOME_PONTO, CODIGO_PRODUTO, CODIGOF_PRODUTO,
NOME_PRODUTO, REMESSA DO
  BEGIN
    SELECT COALESCE(SUM(I.DEVOLUCAO), 0), COALESCE(SUM(I.VENDA), 0)
    FROM CE_PONTO_ITEM I
    JOIN PONTO T ON T.ID_PONTO = I.ID_PONTO
    JOIN EDICAO E ON E.ID_EDICAO = I.ID_EDICAO
    JOIN PRODUTO P ON P.ID_PRODUTO = E.ID_PRODUTO
    WHERE T.CODIGO_PONTO = :CODIGO_PONTO AND P.CODIGO_PRODUTO =
:CODIGO_PRODUTO
    INTO DEVOLUCAO, VENDA;

    SELECT COALESCE(SUM(Q.QUANTIDADE), 0)
    FROM ESTOQUE Q
    JOIN PONTO T ON T.ID_PONTO = Q.ID_PONTO
    JOIN EDICAO E ON E.ID_EDICAO = Q.ID_EDICAO
    JOIN PRODUTO P ON P.ID_PRODUTO = E.ID_PRODUTO
    WHERE T.CODIGO_PONTO = :CODIGO_PONTO AND P.CODIGO_PRODUTO =
:CODIGO_PRODUTO
    INTO ESTOQUE;

    SUSPEND;
  END
END
=========

Em qua, 6 de jun de 2018 às 11:37, Gabriel Bonzanini <
gabriel.bonzanini em gmail.com> escreveu:

> Revise os joins utilizados, verificando se está sendo feita a ligação
> utilizando todas as primary keys das tabelas referenciadas.
>
> Em 5 de junho de 2018 22:19, Renan Rogowski Pozzo <renanrpozzo em gmail.com>
> escreveu:
>
> > O SUM vai somar todos os registros que retonarem na consulta. Se algum
> dos
> > joins a relação retornar mais de um registro vai somar duas, ou mais,
> > vezes.
> >
> > Tente fazer o select retornando todos os registros para ver se esse é o
> > problema.
> >
> > Em ter, 5 de jun de 2018 às 21:18, Paulo Geloramo <
> > assisinformatica em gmail.com> escreveu:
> >
> > > SELECT
> > > COALESCE(SUM(I.QUANTIDADE), 0) AS REMESSA,
> > > COALESCE(SUM(C.VENDA), 0) AS VENDA,
> > > COALESCE(SUM(Q.QUANTIDADE), 0) AS ESTOQUE
> > > FROM NOTA_PONTO_ITEM I
> > > JOIN PONTO T ON T.ID_PONTO = I.ID_PONTO
> > > JOIN EDICAO E ON E.ID_EDICAO = I.ID_EDICAO
> > > JOIN PRODUTO P ON P.ID_PRODUTO = E.ID_PRODUTO
> > > JOIN ASSUNTO A ON A.ID_ASSUNTO = P.ID_ASSUNTO
> > > LEFT JOIN CE_PONTO_ITEM C ON (C.ID_PONTO = T.ID_PONTO AND C.ID_EDICAO =
> > > E.ID_EDICAO)
> > > LEFT JOIN ESTOQUE Q ON (Q.ID_PONTO = T.ID_PONTO AND Q.ID_EDICAO =
> > > E.ID_EDICAO)
> > > WHERE T.CODIGO_PONTO = 1000
> > > AND A.CODIGO_ASSUNTO = 10
> > >
> > > Firebird 2.5.8
> > > Quando faço três consultas separadas
> > > retorna o total correto.
> > >
> > > Com dois LEFT JOIN retorna
> > > o total da REMESSA errado.
> > >
> > > Alguma sugestão para retornar
> > > REMESSA, VENDA e ESTOQUE na mesma
> > > consulta?
> > >
> > > --
> > > Paulo Esteves
> > > ______________________________________________
> > > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > > http://www.firebase.com.br/fb/artigo.php?id=1107
> > > Para consultar mensagens antigas:
> > > http://www.firebase.com.br/pesquisa_lista.html
> > >
> > --
> > Abraço,
> > Renan Rogowski Pozzo
> >
> > *"E a paz de Deus, que excede todo o entendimento, guardará os vossos
> > corações e os vossos pensamentos em Cristo Jesus." Filipenses 4.7*
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://www.firebase.com.br/
> > pesquisa_lista.html
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>



Mais detalhes sobre a lista de discussão lista