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)
-   -   Update con Inner Join Funciona en Access pero no en firebird (https://www.clubdelphi.com/foros/showthread.php?t=32482)

Acanol 07-06-2006 11:47:46

Update con Inner Join Funciona en Access pero no en firebird
 
Muy buenas, tengo la siguiente consulta en acces la cual funciona perfectamente, pero estoy migrando a firebird y no consigo que me funcione, ¿Que modificaciones debo hacer?

Código SQL [-]
     UPDATE TBSALIDA2 TbS2 INNER JOIN TBPUNTOSCIRCUITO TbPnts
     ON TbS2.CODPUNTO=TbPnts.NUMPUNTO 
     SET TbS2.NUMMARCHA = TbPnts.NUMMARCHA

celades1 07-06-2006 15:29:08

hola

Código SQL [-]
 UPDATE TBSALIDA2 TbS2 SET TbS2.NUMMARCHA = 
 ( select TbPnts.NUMMARCHA from TBPUNTOSCIRCUITO TbPnts
     where TbS2.CODPUNTO=TbPnts.NUMPUNTO )

saludos

Acanol 07-06-2006 16:13:24

Muy buenas, gracias por tu respuesta Celades1, tu propuesta funciona perfectamente, pero me pregunto si seria posible evitar tener que hacer la subconsulta (iria mas rapido si pudiesemos evitarla, ¿no?), ¿existiria alguna otra alternativa?.

Muchas gracias por tu tiempo.

Paoti 07-06-2006 21:32:41

ineer join versus where
 
Hola.


La solución que te presenta celades es muy buena.



y por experiencia (o hábito), siemrpe he usado subconsultas o clausula WHERE en vez de utilizar JOINS.



Seria interesante hacer una prueba de performance sobre cual de las dos formas puede tener un mejor rendimiento, hablando ya de grandesvolumenes de datos.



porque lagunos opinas que con JOINS, otros que con WHERE.

Acanol 08-06-2006 09:10:41

Buenos dias, yo soy un pipiolo en esto de las bases de datos (en especial con firebird) y estoy aprendiendo por dias, me encanta :D. Mi jefe me dice que quiere hacerlo con joins porque dice que es mas rapido, y si el lo dice... xDD yo mientras no me den una solucion de como se hace con joins en firebird (que no se si sera posible) sigo con la opcion de celades que me funciona de P*** M**** XDD ;).

mightydragonlor 27-05-2012 00:58:31

Encontré este ejemplo que me ha servido de mucho con updates masivos.

Código SQL [-]
EXECUTE BLOCK
AS
DECLARE VARIABLE field1 type;
DECLARE VARIABLE field2 type;
...etc.
DECLARE VARIABLE pk type;
BEGIN
for select pk, field1, field2, ... from src_table
into :pk, :field1, :field2, ...
do update dest_table set field1 = :field1, field2 = :field2, ...
where pk = :pk;
END

Espero le sirva a alguien.

Saludos.

Casimiro Notevi 27-05-2012 01:19:25

Está bien saberlo 6 años después :D
De todas formas, no sé si eso andará en firebird :)

mightydragonlor 27-05-2012 01:25:48

Código SQL [-]
    --Actualizamos los ingredientes
    --reduciendo la cantidad de los mismos
    --en la proporción requerida por los detalles de la formula
      FOR SELECT
        FD.INGR_UUID, FD.FODE_CANTIDAD
      FROM
        TBLFORMULA F
        INNER JOIN TBLFORMULA_DETALLE FD ON F.FORM_UUID = FD.FORM_UUID
        --INNER JOIN TBLINGREDIENTE I ON FD.INGR_UUID = I.INGR_UUID
      WHERE
        F.FORM_UUID = CHAR_TO_UUID(:FORM_UUID_IN)
        AND (FD.FODE_ACTIVO = '1') --Sólo se consulta lo activo.
        --AND (I.INGR_CANTIDAD < (FD.FODE_CANTIDAD * :CANTIDAD)) --Menor cantidad de ingredientes de los necesarios
      INTO
        :INGR_UUID,
        :FODE_CANTIDAD
      DO
      UPDATE TBLINGREDIENTE IU
      SET
        IU.INGR_CANTIDAD = IU.INGR_CANTIDAD - (:FODE_CANTIDAD * :CANTIDAD)
      WHERE
        IU.INGR_UUID = :INGR_UUID;
Yo acabo de hacer esto y me funciona perfectamente =)


La franja horaria es GMT +2. Ahora son las 06:17:04.

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