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)
-   -   consulta en Firebird 1.5.3 (https://www.clubdelphi.com/foros/showthread.php?t=37819)

pvizcay 23-11-2006 16:49:45

consulta en Firebird 1.5.3
 
Hola gente del foro, tengo una consulta que se me cruzó y no puedo sacar un solución limpia en FB para la misma.. si alguno tiene una sugerencia se lo agradeceré:

básicamente quiero computar / filtrar sobre columnas computadas (no de la tabla sobre la que estoy consultando)

Código SQL [-]
select (select ... {consulta compleja}) as A,
         (select ... {consulta compleja}) as B,
         A - B as C <-- no me deja
from XXX
where A <> 0 or B <> 0 <-- también me da error

eso me imaginé no iba a funcionar sabiendo que los where y eso tienen que estar sobre columnas de la tabla base..

el problema es que repeterir la consulta donde uso las referencias a las columnas computadas (suponiendo que el optimizador que no se como funciona no se de cuenta de que está repetida) me duplicaría todo el tiempo de la consulta...

también intente:

select A, B, (A-B) as C from
(
select (select ... {consulta compleja}) as A,
(select ... {consulta compleja}) as B
from XXX
)
where A <> 0 or B <> 0
[/sql]

pero me indica error en la línea 3, invalid token por lo que deduje que un select * from (select * ..)) no es permitido en el firebird..

de más está decir que busco una solución en sql limpia, también podria procesar el dataset resultante por código pero no es la idea..
lo otro que se me ocurre es crear un stored procedure selecteable como en

Código SQL [-]
select A, B, (A-B) as C  from
PROCEDURE_SELECT
where A <> 0 or B <> 0

pero me no me termina de convencer..

alguna idea??

gracias!!

AGAG4 24-11-2006 03:18:01

Si quieres hacer un Select donde contenga SubSelect's si se puede, pero no te funcionarìa un SubSelect con Asterisco * (Select *from....) aqui debes de indicar 1 sòlo campo ò grupos de campos por ejemplo:
Código SQL [-]
select A, B, (A-B)  C from
(
select (select CAMPO1+CAMPO2 {consulta compleja})  A,
(select CAMPO1+CAMPO2  {consulta compleja})  B
from XXX
)
where A <> 0 or B <> 0
[/sql]

Espero haberme explicado.

pvizcay 24-11-2006 05:06:34

clarifico más
 
si entiendo lo que me indicas y desde ya gracias por tomarte la molestia en leer y responder, pero el problema creo no viene por ahi.. entiendo que un subselect debe devolver un solo campo, generalmente se usan
a) para generar un campo computado: select A, B, (select D + A where..) from X
b) para generar un valor en un predicado del where: select * from X where A = (select B + C from X where...)

aca lo que intento es hacer un select de otro select como en: select A, B, A - B from ( select A, B from XXX where...) where..

dejo la consulta en cuestión super simplificada

Código SQL [-]
select ID_CUENTA, SALDO_COLUMNA1, SALDO_COLUMNA2, (SALDO_COLUMNA1 - SALDO_COLUMNA2) as DIFERENCIA from
(
    select CUE.ID_CUENTA,
        (select sum(DEBE) from MOVIMIENTOS_ASIENTO MVA) as SALDO_COLUMNA1,
        (select sum(HABER) from MOVIMIENTOS_ASIENTO MVA) as SALDO_COLUMNA2
    from CUENTAS CUE
    order by CUE.CODIGO
)
where (SALDO_COLUMNA1 <> 0) or (SALDO_COLUMNA2 <> 0)

la misma me indica:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 5.
select.

gracias!!!

pvizcay 30-11-2006 16:59:31

termine haciendo un SPs con el select interior y hacieno select sobre el mismo.. no encontre nada mejor
salu2

Paoti 30-11-2006 17:42:45

no huebira sido mejor


Código SQL [-]
select f.id_cuenta, sum(m.haber), m.sum(debe),  sum(m.haber)  - sum (debe) from
cuentas f, movimientos m,
where f..id_cuenta = m.id_cuenta


como vez?

pvizcay 01-12-2006 01:27:27

no..
 
Cita:

Empezado por Paoti
no huebira sido mejor


Código SQL [-]
select f.id_cuenta, sum(m.haber), m.sum(debe),  sum(m.haber)  - sum (debe) from
cuentas f, movimientos m,
where f..id_cuenta = m.id_cuenta


como vez?

Me parece que no.. partistes de un ejemplo simplificado ya que lo que computo no es un sencillo sum, sino una consulta bastante costosa (mira mi primer post) y (suponiendo) que esta se compute nuevamente en el caso de la resta la consulta en total llevaria el doble de tiempo en concretarse.. dudo mucho que el optimizador se de cuenta que en la columna 3 se usa la diferencia de dos selects de las cols 1 y 2 pero si estoy equivocado que alguien me corriga.. por cierto lo que quería hacer no es posible en FB1.5 pero esta en FB2...!

de la página de reformas en firebird 2:

"Many new additions have been made to the SQL language, including support for derived tables (SELECT ... FROM ( SELECT ... FROM)) with multiple layers of nesting and the ability to join nested sets, as defined by SQL200X."

pueden chequearlo en:
http://www.firebirdsql.org/index.php...d=fb20_release

saludos!


La franja horaria es GMT +2. Ahora son las 01:57: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