Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consultas SQL similares? (https://www.clubdelphi.com/foros/showthread.php?t=60962)

seara2005 20-10-2008 22:01:29

Consultas SQL similares?
 
Hola a todos

Mi situación es la siguiente:
Utilizo Delphi 2007, Firebird 2.1. y me conecto con los Ib componentes.
Tengo tres tablas (Cuentas con unos 10 registros, AFT con unos 700 registros y Transac con unos 35 mil registros) el tamaño de la base de datos es de 3.3 mb.
El problema es que estoy realizándo aparentemente la misma consulta SQL de dos formas distintas:
La primer forma:
Código SQL [-]
Select Ctas.Codigo, Ctas.Descripcion, Sum(Tr.valor_resid)
From Cuentas Ctas, AFT, transac Tr
Where Ctas.Codigo = AFT.Cuenta
And Tr.Periodo = '07-02'
And AFT.Codigo = Tr.CodAft
Group by Ctas.Codigo, Ctas.Descripcion
De esta forma se realiza la consulta en un instante.

La segunda forma es la siguiente:
Código SQL [-]
Select Ctas.Codigo, Ctas.Descripcion,
       Sum(Case When Ctas.codigo = AFT.Cuenta
                And  Tr.Periodo = '07-02'
                Then (Tr.Valor_Resid)
                else 0
           End)
From Cuentas Ctas, AFT, transac Tr
Group by Ctas.Codigo, Ctas.Descripcion

De esta forma se demora como tres minutos procesando y al final me da el error <Insuficiente espacio en disco> y el disco tiene mas de tres gb libres.
Por supuesto la forma que necesito que me funcione es la segunda ya que debo incluir mas campos con otras condiciones.

Como me cansé de compilar tantas veces el programa ya pasé directamente ambas consultas con el IbExpert en la base de datos y el resultado es el mismo.

De antemanos muchas gracias por la ayuda que me puedan prestar.

ContraVeneno 20-10-2008 22:16:23

la primera la ejecuta rápido porque estas filtrando los registros. La segunda forma no filtras nada, traes absolutamente todos los registros de las tres tablas y por eso te marca ese error y por eso se tarda tanto.

Tienes que filtrar los registros, intenta con:
Código SQL [-]
Select Ctas.Codigo, Ctas.Descripcion,
Sum(Case when Tr.Periodo is null then 0 else Tr.Valor_Resid end)
From Cuentas Ctas
join Aft on Ctas.Codigo = AFT.Cuenta
left outer join Transac TC on Tr.Periodo = '07-02'
Group By Ctas.Codigo, Ctas.Descripcion
aunque creo que haría falta agregar más campos en el group by. Pero no tengo firebird para probarlo

seara2005 21-10-2008 06:53:26

Gracias ContraVeneno por tu pronta respuesta, al final lo logré de la siguiente forma:
Código SQL [-]
Select Cuentas.Codigo, Cuentas.descripcion,
(Select Sum(Transac.Valor_Resid) from transac, AFT
     Where Transac.periodo='07-02'
     And AFT.codigo=Transac.CodAft
     And AFT.Cuenta=Cuentas.Codigo
 ) As SaldoInic,
 (Select Sum(AFT.ValorIni) from AFT
     Where AFT.Fechaalta>='01/01/07'
     And AFT.fechaalta<='12/31/07'
     And AFT.Cuenta=Cuentas.Codigo
 ) As Altas
 From Cuentas
 Order by Cuentas.Codigo


La franja horaria es GMT +2. Ahora son las 16:20:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi