queria ajuda nessa pesquisa SQL

12/12/2005

1

Nao sei se o topico deveria estar aqui, mas creio q muitos poderao me ajudar. Estou usando o Delphi e o Rave para criar relatorios com aspecto visual melhor, uma vez q o sistema é DOS e em Clipper, o problema é q usa arquivos DBF como banco de dados, e tenho uma consulta que esta demorando muito tempo pois um dos arquivos tem 55 Mbs!!! Quando mando fazer a consulta do jeito q esta construida demora minutos no SQL explorer, nem tentei ai ver como o TQuery vai se comportar. Abaixo segue a consulta.. qq ideia vai ser util. Pensei em fazer uma UNION, mas nao to sabendo como, tb vo colocar como eu pensei q seria...

Abraço a todos e espero q tenham como me ajudar!!

[size=9:103b108635]SELECT fa.nro_cheque, b.nome_bco, ccp.dt_cheque, ccp.valor AS VALORCHEQUE,
fa.nro_fat AS INV, f.nome_for, fa.dt_fat, fa.val_total AS VALORFATURA,
s.nro_file, s.dt_ini, s.dt_fim, cs.descr_ser AS SERV1, ss.descr_ser3 AS SERV2,
cs2.descr_ser AS SSERV, s.moeda_sale, s.id_moeda, s.inc_opc,
s.tot_netps, subs.tot_net, s.tot_ft, s.tot_saleps,
fs.val_conf, subs.st_pag, fa.val_fat

FROM FAT_APAG fa INNER JOIN FATSER fs
ON fa.nro_fat = fs.nro_fat
LEFT JOIN SERV s
ON fs.nro_file = s.nro_file AND fs.nro_ser = s.nro_ser
LEFT JOIN SSERV subs
ON s.nro_file = subs.nro_file AND s.nro_ser = subs.nro_ser
LEFT JOIN SERVCRES ss
ON s.nro_file = ss.nro_file AND s.nro_ser = ss.nro_ser
INNER JOIN CHEQUECP ccp
ON fa.nro_cheque = ccp.nro_cheque AND fa.id_banco = ccp.id_banco AND fa.id_agencia = ccp.id_agencia
AND fa.nro_conta = ccp.id_conta
INNER JOIN TAB_BCO b
ON fa.id_banco = b.id_bco
LEFT JOIN CADSER cs
ON s.id_ser = cs.id_ser
LEFT JOIN CADSER cs2
ON subs.id_ser = cs2.id_ser
INNER JOIN CADFOR f
ON fa.id_for = f.id_for

WHERE fa.st_pag < ´3´ AND fa.lt_ou_chq = ´C´
ORDER BY fa.nro_cheque,fa.nro_fat[/size:103b108635]


O UNION queria fazer assim :


SELECT fa.nro_cheque, b.nome_bco, ccp.dt_cheque, ccp.valor AS VALORCHEQUE,
fa.nro_fat AS INV, f.nome_for, fa.dt_fat, fa.val_total AS VALORFATURA


FROM FAT_APAG fa INNER JOIN FATSER fs
ON fa.id_fat = fs.id_fat
INNER JOIN CHEQUECP ccp
ON fa.nro_cheque = ccp.nro_cheque
AND fa.id_banco = ccp.id_banco
AND fa.id_agencia = ccp.id_agencia
AND fa.nro_conta = ccp.id_conta
INNER JOIN TAB_BCO b
ON fa.id_banco = b.id_bco
INNER JOIN CADFOR f
ON fa.id_for = f.id_for
UNION ( SELECT xxxx
FROM SERV s
ON fs.nro_file = s.nro_file AND fs.nro_ser = s.nro_ser
LEFT JOIN SSERV subs
ON s.nro_file = subs.nro_file AND s.nro_ser = subs.nro_ser
LEFT JOIN SERVCRES ss
ON s.nro_file = ss.nro_file AND s.nro_ser = ss.nro_ser
LEFT JOIN CADSER cs
ON s.id_ser = cs.id_ser
LEFT JOIN CADSER cs2
ON subs.id_ser = cs2.id_ser )
. . .

Mas nao sei se é possivel. O Arquivo de 55 Mb é o SERV, por isso queria q o JOIN com ele fosse efetuado so depois de ja ter as linhas q realmente me interessam, pois os dados nele sao os detalhes.


Obrigado de uma vez galera!!!


Responder

Posts

14/12/2005

Sremulador

provavelmente este ´montes´ de join que esta fazendo sua consulta demorar...


Responder

14/12/2005

Thiagodede

Provavelmente nao!!! É isso

Isso eu ja sei.. queria saber se havia outros modos de fazer a consulta, de modo a agilizar. EX.. fazer um select menor primiero, q precise de 1 join so, para depois fazer os outros join, pois teriam menos linhas...

Sacou..


Responder

15/12/2005

Pereiramarcos

ja tentou tranformar suas tabelas em conjunto e aplicara regras de conjunto as vezes ajuda nestes casos complexos de querye


Responder

15/12/2005

Thiagodede

Como faço isso!?
Nao sei !! hehe


Responder