Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
Question 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...
Responder Con Cita
  #2  
Antiguo 31-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 31-05-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
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.
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #4  
Antiguo 31-05-2007
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
Esto ultimo debe funcionar cuando menos en DB2, ademas de Orale

Saludos
__________________
Ernesto R.
Responder Con Cita
  #5  
Antiguo 31-05-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
actualizar

desafortunadamente estoy trabajando con access y no funciona
Responder Con Cita
  #6  
Antiguo 01-06-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
entocne sprueba la soucion de roman,


__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
Responder Con Cita
  #7  
Antiguo 01-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
Unhappy 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...
Responder Con Cita
  #8  
Antiguo 01-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #9  
Antiguo 01-06-2007
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #10  
Antiguo 01-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #11  
Antiguo 01-06-2007
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar un campo de una tabla con datos que se encuentran en otra tabla Morphine SQL 4 15-12-2006 22:47:42
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27-07-2006 15:36:12
Actualizar tabla con datos de otra tabla ElDioni SQL 2 02-05-2006 16:04:04
Actualizar un campo segun opcion de picklist de otra columna de un dbgrid nefy Conexión con bases de datos 5 17-01-2004 20:11:34
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28-08-2003 11:29:40


La franja horaria es GMT +2. Ahora son las 10:00:38.


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
Copyright 1996-2007 Club Delphi