Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   actualizar datos de una tabla según datos de otra. (https://www.clubdelphi.com/foros/showthread.php?t=44231)

GustavoCruz 31-05-2007 18:28:12

actualizar datos de una tabla según datos de otra.
 
hola a todos,

mi inconveniente es porque tengo una tabla que será actualizada (solo algunos campos), esta tomará datos de otra tabla (solo algunos campos)

la sentencia SQL para las inserciones es la siguiente:

Código SQL [-]
insert into tabladestino(campo1,campo2...) select (campo1,campo2...) from tablaorigen where ...

eso funciona perfectamente.

pero en el caso de las actualizaciones donde la estructura de la sentencia es la siguiente:

Código SQL [-]
update tabla set campo1=xxxxxxxx, campo2=yyyyyyy where ....

como hago para pasar los datos de la tabla origen a la tabla destina utilizando update

espero me hayan entendido...

agradezco toda la ayuda que me puedan brindar...

roman 31-05-2007 18:44:35

Algo como:

Código SQL [-]
update destino
set campo1 = (
  select origen.campo1 from origen where destino.KEY = origen.KEY
),
set campo2 = (
  select origen.campo2 from origen where destino.KEY = origen.KEY
)
...

donde destino.KEY = origen.KEY significa que debes relacionar de alguna manera uno-a-uno ambas tablas. Lo malo aquí, es que requieres una subconsulta por cada campo.

Algunos motores, como MySQL permiten una modificación de la sentencia INSERT que sólo inserta nuevos registros y actualiza los ya existentes.

// Saludos

Paoti 31-05-2007 18:56:26

su usas Oracle, en los demas no sé si se pueda, puedes hacer.

Código SQL [-]
UPDATE TABLA1 SET (CAMPO1, CAMPO2, CAMPO3) = (SELECT C1, C2, C3 FROM TABLA2 WHERE TABLA2.PK2 = TABLA1.PK1)



saludos.

ramiretor 31-05-2007 20:15:48

Hola:
Esto ultimo debe funcionar cuando menos en DB2, ademas de Orale

Saludos

GustavoCruz 31-05-2007 23:37:36

actualizar
 
desafortunadamente estoy trabajando con access y no funciona

Paoti 01-06-2007 00:26:52

entocne sprueba la soucion de roman,


:)

GustavoCruz 01-06-2007 01:06:19

actualizar
 
utilicé la forma de roman pero no me dio, inicialmente supuse que esa era la forma. realmente no quería utilizar el método que utilicé

que es este

Código Delphi [-]
while not tablaorigen.eof do begin
with query do begin 
  sql.clear
  sql.add('update tabla set campo1='+tablaorigencampo1.asinteger
  +', campo2='+tablaorigencampo2.asinteger)
  excsql
end;
tablaorigen.next; end;

que era lo que normalmente utilizaba para copiar datos de una tabla a otra...
creo que me entienden, es que no quiero utilizar ese método puesto que vuelve al sistema muy lento...

roman 01-06-2007 17:40:33

Pero esa consulta que muestras está muy rara. No hay ninguna condición para el UPDATE, lo que significa que en cada vuelta del bucle ¡actualizas todos los registros de la tabla destino! Desde luego que va a ser muy lento.

// Saludos

AzidRain 01-06-2007 20:23:49

con MySQL, a la instruccion INSERT se le puede indicar que hacer si el registro ya existe (basado en los indices primarios) que puede ser actualizarlo o ignorarlo. Por otra parte usar selects anidados aunque si da el resultado incrementa la carga del servidor pues por cada registro se ejecuta un query adicional. En tablas pequeñas no se nota mucho pero en unos cuantos miles ya hay diferencia.

roman 01-06-2007 20:31:19

Si las tablas son MyISAM no es tan tardado. Eso sí, la tabla origen debe estar indexada sobre el campo que haga referencia a la tabla destino; de lo contrario sí será sumamente lento.

// Saludos

GustavoCruz 01-06-2007 23:18:44

actualizar
 
esta es la solución que di al problema.

Código Delphi [-]
procedure TfPrincipal.Button3Click(Sender: TObject);
var estado:string;
begin
estado:='Deudor';
while not fModulo.rtable.Eof do
  begin
    if(fModulo.rtablercuota.AsFloat-fModulo.rtablerpago.AsFloat)=0then
    estado:='salvo';
    sqlx:='update patable set paefectivo ='''+fModulo.rtablerpago.AsString
    +''',pasaldo='''+FloatToStr(fModulo.rtablercuota.AsFloat-  fModulo.rtablerpago.AsFloat)
    +''', paestado='''+estado+''',paHora='''+FormatDateTime('hh:mm:ss AM/PM',pahorapago.Time)
    +''',paFechaPago='''+FormatDateTime('dd/mm/yyyy',pagafecha.Date)
    +''' where paSolicitud='+fModulo.rtablerlibranza.AsString
    +' and format(paFechaAcuerdo,''mm/yyyy'')='''
    +FormatDateTime('mm/yyyy',fModulo.rtablerfecha.AsDateTime)+'''';
    EjecutarSQL(sqlx);
    fModulo.rtable.Next;
  end;
end;

ahí tiene las condiciones el update, ahora imagínense el comportamiento de la aplicación al realizar un ciclo de 1500 veces y hasta más, utilizando ese procedimiento...

Lo que me gustaría a mí, sería encontrar la forma de no utilizar ese procedimiento y poderlo aplicar a base mdb o db para las actualizaciones masivas.

si alguien me puedar dar más información le agradecería.


La franja horaria es GMT +2. Ahora son las 11:27:46.

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