Evandro Ricardo Silvestre escreveu:
> ..:: Rodrigo (-_-) Machado ::.. wrote:
>> Bom dia pessoal, nao sei se posso postar este tipo de topico na lista, 
>> mas ca estou eu.
>> Sou bem iniciando no mundo SQL, e preciso otimizar esta consulta.
>>
>> select c_cpd, sum(n_cant) from (                     
>>     select c_cpd, sum(n_cant) as n_cant from movie
>>         where c_sucursal>='001' and c_sucursal<='001'
>>         group by c_cpd
>>     union all
>>     select c_cpd, sum(n_cant)*-1 as n_cant from movis
>>         where c_sucursal>='001' and c_sucursal<='001'
>>         group by c_cpd
>> ) as movi
>> group by c_cpd
>> order by c_cpd
> Não sei se entendi direito, mas ai vai uma dica:
> 
>     select movie.c_cpd, sum(movie.n_cant + (movis.n_cant)*-1) as n_cant 
> from movie
>        JOIN movis ON (movis.c_cpd = movie.c_cpd)
>         where movie.c_sucursal>='001' and movie.c_sucursal<='001'
>         group by movie.c_cpd
> 
> Apenas é necessário validar se o join que montei é valido para seu 
> escopo, olhando a estrutura do seu select acredito que seja.
> Isso fica bem mais rapido e bem mais simples.
> 


Creio que o correto seria FULL OUTER JOIN no lugar da (INNER) JOIN.
Poderia também simplificar para: sum(movie.n_cant - movis.n_cant)

SELECT coalesce(movie.c_cpd, movis.c_cpd) AS c_cpd,
        sum(movie.n_cant - movis.n_cant) AS n_cant
FROM movie FULL OUTER JOIN movis ON (movis.c_cpd = movie.c_cpd)
GROUP BY 1
ORDER BY 1

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a