[firebase-br] Melhorar sentença SQL

Sandro Souza escovadordebits em gmail.com
Qua Maio 27 09:59:54 -03 2009


Bom dia/tarde Tetraetila.

Acredito que você possa uní-las da seguinte forma:

select A.A005_TIPO, A.A005_DMOV, A.A005_NFIN, A.A005_NFFI, A.A005_SERI,
A.A005_SUBS, A.A005_EMIT, A.A005_VCON, A.A005_TIPO, B.A028_CFOP, B.A028_SEQU
from A024005_tbl A, A024028_tbl B where A.A005_DMOV between '01.01.2008' and
'31.01.2008' and A.A005_DMOV = B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and
A.A005_NFFI = B.A028_NFFI and A.A005_SERI = B.A028_SERI and A.A005_SUBS =
B.A028_SUBS and A.A005_EMIT = B.A028_EMIT and A.A005_TIPO IN('1','4') and
B.A028_INTE <> 'N' order by A.A005_DMOV, A.A005_NFIN

Note que alterei a condição do campo A.A005_TIPO para sejam retornados os
registro tanto com o valor '1' quanto os que tem o valor '4' nesse mesmo
campo, e para saber o tipo de registro, também acrescentei esse mesmo campo
na cláusula SELECT para podermos diferenciá-los.

Agora, o SELECT dos somatórios:

select A.A005_TIPO, sum(A.A005_VCON) AS TOTAL from A024005_tbl A,
A024028_tbl B where A.A005_DMOV between '01.01.2008' and '31.01.2008'  and
A.A005_DMOV = B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and A.A005_NFFI =
B.A028_NFFI and A.A005_SERI = B.A028_SERI and A.A005_SUBS = B.A028_SUBS and
A.A005_EMIT = B.A028_EMIT and A.A005_TIPO IN('1','4') and B.A028_INTE <> 'N'
group by A.A005_TIPO order by A.A005_TIPO

Da mesma forma que o SELECT anteior, apenas alterei a condição do campo
A.A005_TIPO, assim como coloquei-o na cláusula SELECT, tendo o cuidado de
agrupar os somatórios pelos respectivos valores ('1' e '4') desse mesmo
campo.

Só por curiosidade, você poderia confirmar se essas duas tabelas (A024005_tbl
e A024028_tbl) tem a mesma estrutura? Aparentemente, são tabelas idênticas,
diferenciando apenas nos seus nomes e nos nomes de seus respectivos campos.

Se tiverem a mesma estrutura, porque criar tabelas diferentes com a mesma
estrutura? Porque não criar uma tabela única e acrescentar um campo contendo
um código ('005', '028', etc...) para diferenciar seus registros?

Espero ter ajudado mais que atrapalhado. :D

2009/5/27 tetraetila® <tetraetila em gmail.com>

> Olá Pessoal
>
> Faço dois "select's" que extraem dados de duas tabelas A001005_TBL e
> A001028_TBL a cláusula where que diferencia um select do outro é apenas
> A.a005_tipo = '4' ou A.a005_tipo = '1', tem como eu melhorar isto fazendo
> apenas uma sentença e não as duas? O mesmo critério eu utilizo para somar. O
> que eu quero é otimizar estas sentenças uma vez que as utilizo em vários
> outros locais.
>
> Muito obrigado!
>
> Adilson
>
>
> Obs.: Sentenças abaixo:
>
> Tipo = '1'
>
> select A.A005_DMOV, A.A005_NFIN, A.A005_NFFI, A.A005_SERI, A.A005_SUBS,
> A.A005_EMIT, A.A005_VCON, A.A005_TIPO, B.A028_CFOP, B.A028_SEQU from
> A024005_tbl A, A024028_tbl B where A.A005_DMOV between '01.01.2008' and
> '31.01.2008' and A.A005_DMOV = B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and
> A.A005_NFFI = B.A028_NFFI and A.A005_SERI = B.A028_SERI and A.A005_SUBS =
> B.A028_SUBS and A.A005_EMIT = B.A028_EMIT and A.A005_TIPO = '1' and
> B.A028_INTE <> 'N' order by A.A005_DMOV, A.A005_NFIN
>
> Tipo = '4'
>
> select A.A005_DMOV, A.A005_NFIN, A.A005_NFFI, A.A005_SERI, A.A005_SUBS,
> A.A005_EMIT, A.A005_VCON, A.A005_TIPO, B.A028_CFOP, B.A028_SEQU from
> A024005_tbl A, A024028_tbl B where A.A005_DMOV between '01.01.2008' and
> '31.01.2008' and A.A005_DMOV = B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and
> A.A005_NFFI = B.A028_NFFI and A.A005_SERI = B.A028_SERI and A.A005_SUBS =
> B.A028_SUBS and A.A005_EMIT = B.A028_EMIT and A.A005_TIPO = '4' and
> B.A028_INTE <> 'N' order by A.A005_DMOV, A.A005_NFIN
>
>
> Soma Tipo = '1'
>
> select sum(A.A005_VCON) AS TOTAL from A024005_tbl A, A024028_tbl B where
> A.A005_DMOV between '01.01.2008' and '31.01.2008'  and A.A005_DMOV =
> B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and A.A005_NFFI = B.A028_NFFI and
> A.A005_SERI = B.A028_SERI and A.A005_SUBS = B.A028_SUBS and A.A005_EMIT =
> B.A028_EMIT and A.A005_TIPO = '1' and B.A028_INTE <> 'N'
>
> Soma Tipo = '4'
>
> select sum(A.A005_VCON) AS TOTAL from A024005_tbl A, A024028_tbl B where
> A.A005_DMOV between '01.01.2007' and '31.12.2007' and A.A005_DMOV =
> B.A028_DMOV and A.A005_NFIN = B.A028_NFIN and A.A005_NFFI = B.A028_NFFI and
> A.A005_SERI = B.A028_SERI and A.A005_SUBS = B.A028_SUBS and A.A005_EMIT =
> B.A028_EMIT and A.A005_TIPO = '4' and B.A028_INTE <> 'N'
>
>
> ______________________________________________
> 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://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista