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)
-   -   Modificacion masiva (https://www.clubdelphi.com/foros/showthread.php?t=24386)

Spynosa 18-08-2005 16:02:47

Modificacion masiva
 
Hola a tod@s

Como podria actualizar una tabla con los datos de otra, por ejemplo para insertar lo hago asi:
Código SQL [-]
insert into articulos  select * from articulosex
pero para modificar no se como podría hacerlo porque esto no funciona
Código SQL [-]
update articulos select * from articulosex
Gracias

fabianmk 18-08-2005 22:48:51

Proba con esta forma:

update tabla1
set campo1 = (select campo1
from tabla2
where tabla1.campo = tabla2.campo),
campo2= (select campo2
from tabla2
where tabla1.campo = tabla2.campo)

Salu2

Fabian

Spynosa 19-08-2005 13:30:42

gracias fabian he probado lo que me has dicho asi:

Código SQL [-]
update articulos
set textura  = (select textura
from articulosex
where articulos.codinteno = articulosex.codinteno),
color= (select color
from articulosex
where articulos.codinteno=articulosex.codinteno)
y se me queda el IBExpert colgado
tengo 8.000 articulos no creo que sea por eso ¿no?

Un saludo

lbuelvas 19-08-2005 16:59:26

Que tal con un preocedimiento almacenado ?, normalmente evito el tipo de construcciones basados en SQL pues queda un poco dificil determinar el comportamineto y rendimiento, espero te sirva este ejemplo:

Estas son las tablas por favor colocale datos,

Código SQL [-]
CREATE TABLE TABLA_A (
    ID       INTEGER NOT NULL,
    CAMPO_1  INTEGER,
    CAMPO_2  INTEGER,
    CAMPO_3  INTEGER
);

ALTER TABLE TABLA_A ADD CONSTRAINT PK_TABLA_A PRIMARY KEY (ID);

CREATE TABLE TABLA_B (
    ID       INTEGER NOT NULL,
    CAMPO_1  INTEGER,
    CAMPO_2  INTEGER,
    CAMPO_3  INTEGER
);

ALTER TABLE TABLA_B ADD CONSTRAINT PK_TABLA_B PRIMARY KEY (ID);

Este es un procedimiento simple

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE SP_ACTUALIZACION 
AS
DECLARE VARIABLE V_ID INTEGER;
DECLARE VARIABLE V_CAMPO_1 INTEGER;
DECLARE VARIABLE V_CAMPO_2 INTEGER;
begin
  /* Procedimiento para actualizar datos desde tabla_b hacia tabla_a, con
     modificacion de mas de un campo. */
  for select id,
             campo_1,
             campo_2
      from tabla_b
      into   :v_id,
             :v_campo_1,
             :v_campo_2
  do begin
    update tabla_a
    set    campo_1 = :v_campo_1,
           campo_2 = :v_campo_2
    where  id = :v_id;
  end
end
^

SET TERM ; ^

y este es un procedimiento con notificacion

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE SP_ACTUALIZACION_PLUS 
RETURNS (
    PS_ID INTEGER,
    PS_SALIDA VARCHAR(20))
AS
DECLARE VARIABLE V_CAMPO_1 INTEGER;
DECLARE VARIABLE V_CAMPO_2 INTEGER;
begin
  /* Procedimiento para actualizar datos desde tabla_b hacia tabla_a, con
     modificacion de mas de un campo.
     Se adiciono mejora para indicar el estado de actualizacion, ya que puede
     haber registros en la tabla_b que no se encuentran en la tabla_a.
     Queda de tarea indicar que registros de la tabla_a no estan en tabla_b !
  */
  for select id,
             campo_1,
             campo_2
      from tabla_b
      into   :ps_id,
             :v_campo_1,
             :v_campo_2
  do begin
    if (exists (select first 1 '*'
                from   tabla_a
                where  id = :ps_id)) then
    begin
      update tabla_a
      set    campo_1 = :v_campo_1,
             campo_2 = :v_campo_2
      where  id = :ps_id;
      ps_salida = 'EXISTE';
    end
    else
    begin
      ps_salida = 'NO EXISTE';
    end
    suspend;
  end
end
^

SET TERM ; ^

Spynosa 19-08-2005 23:49:42

Muchas gracias por tu respuesta, me ha funcionado perfectamente, es justo lo que quería.

No te puedes imaginar del apuro que me has sacado.
Gracias

lbuelvas 22-08-2005 16:49:10

Con el mayor de los gustos.

santiago14 07-09-2010 17:58:52

Gracias compañeros, me sirvió este post para hacer algo que me tenía preocupado.

rastafarey 07-10-2010 06:06:05

Resp
 
Bueno lo que no veo es por que no te funciona el Insert ... Select


La franja horaria es GMT +2. Ahora son las 22:58:11.

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