select c/ subquery e verificação de saldo em outra tabela

Forum sobre SQL.

Moderador: Moderadores

paulomhouse
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 04 Jul 2016 10:39
Localização: são paulo / SP

select c/ subquery e verificação de saldo em outra tabela

Mensagem por paulomhouse »

Bom dia a todos.

Tenho o select a abaixo que esta funcionando, porem muito lento.
Gostaria de saber da possibilidade de melhorar-la.

O Banco de dados é o POSTGRESql.

É um SELECT numa tabela de Requisição, mas que traz uma coluna(SELECT azul) como saldo que esta numa tabela de item de uma cotação.

Como eu não consegui verificar o resultado desta campo(SELECT azul), eu repeti no WHERE esta sub (SELECT vermelha).

select r.codigo,r.cod,descr,r.qtde,(select sum(qtde) from a19item group by req_cod having req_cod = r.codigo) as t
from a19req r left join titemg i on r.cod = i.codigo
where r.status='A' and r.qtde-(select sum(qtde) as qtsai from a19item t group by req_cod having req_cod = r.codigo) > 0 ;


Obrigado.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

select c/ subquery e verificação de saldo em outra tabela

Mensagem por alxsts »

Olá!

Seja bem-vindo ao Fórum Paulo!

Fiz algumas modificações no teu código, conforme mostrado abaixo. Como não tenho PostgreSQL instalado e nem as tabelas, não foi possível testar. Por favor, teste e informe se funcionou.

Código: Selecionar todos

SELECT r.codigo
      ,r.cod,
      ,r.descr
      ,r.qtde  
      ,q.qtsai
  FROM a19req r 
 INNER JOIN (SELECT t.req_cod
                   ,SUM(t.qtde) as qtsai 
               FROM a19item t 
              WHERE t.req_cod = r.codigo
           GROUP BY t.req_cod ) as q
         ON r.codigo = q.req_cod
  LEFT JOIN titemg i 
         ON r.cod = i.codigo
 WHERE r.status = 'A' 
   AND (r.qtde - q.qtsai) > 0
PS: Você faz JOIN na tabela titemg mas nenhuma coluna dela é usada. Não sei se é necessário para o teu objetivo. Certamente tem um custo de processamento que pode degradar a performance.

Para melhorar a legibilidade dos posts, sempre que postar código fonte faça-o entre as tags code. É só clicar no botão mostrado abaixo, existente na barra de ferramentas da tela "POSTAR UMA RESPOSTA".
Anexos
Botão Code
Botão Code
Capturar.PNG (6.39 KiB) Exibido 1768 vezes
[]´s
Alexandre Santos (AlxSts)
paulomhouse
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 04 Jul 2016 10:39
Localização: são paulo / SP

select c/ subquery e verificação de saldo em outra tabela

Mensagem por paulomhouse »

Ola Alexandre, obrigado pela recepção.

Pode me corrigir se necessário.

O Inner Join não servira porque eu preciso que que mesmo que não houver na tabela item ele me retornara 0, mas que apareça a Requisição que esta a LEFT.

O problema é que no seu exemplo,era algo que eu ja tinha tentado mas alguns campos não são reconhecidos: ,q.qtsai que vem do SUBSELECT SUM(qtde) as qtsai e da mesma forma na Clausula WHERE (r.qtde - q.qtsai).

Mas resolveu o problema com a geração de um index na tabela a19item.

Sugestão de um Site internacional, que assim como vocês, estão muito dispostos a colaborar, http://www.hmgforum.com.

Quanto aos códigos, da próxima vez formatarei conforme você orientou.

Muitíssimo obrigado.
paulomhouse
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 04 Jul 2016 10:39
Localização: são paulo / SP

select c/ subquery e verificação de saldo em outra tabela

Mensagem por paulomhouse »

Bom dia.

Mais uma vez obrigado, não somente a quem postou, mas também a quem verificou a msg. pensando em responder.
Responder