Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-11-2007
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Actualizar tabla con datos de otra tabla mediante UPDATE

Es posible realizar en firebird la actualizacion de una tabla con los datos de otra, estan en la misma BD, seria correcto asi?
Código SQL [-]
uptade ventas_new set nombre= ventas_old.nombre from ventas_old where id = ventas_old.id

Es correcto, o fallo en algo.
Es que lo estoy haciendo desde EMS SQL Manager 2005 for InterBase & Firebird y me da error.

Saludos.
Responder Con Cita
  #2  
Antiguo 27-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
La consulta correcta sería:

Código SQL [-]
update ventas_new a set a.nombre = (select b.nombre from ventas_old b where b.id = a.id)


Saludos...
Responder Con Cita
  #3  
Antiguo 27-11-2007
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Gracias, mañana probaremos a ver que tal.
Responder Con Cita
  #4  
Antiguo 27-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por maeyanes Ver Mensaje
La consulta correcta sería:

Código SQL [-]
update ventas_new a set a.nombre = (select b.nombre from ventas_old b where b.id = a.id)
Me temo que de esa manera conseguiremos una consulta muy lenta y ademas el b.nombre quedara repetido en toda la tabla ventas_new, para evitar eso habra que agregar la condición adecuada fuera de la subconsulta.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 27-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
mmm por que va a quedar repetido?
Responder Con Cita
  #6  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por maeyanes Ver Mensaje
mmm por que va a quedar repetido?
Código SQL [-]
update ventas_new a set a.nombre = (select b.nombre from ventas_old b where b.id = a.id)

Bueno, fraccionemos el ejercicio un poco haciendo una especie de "prueba de escritorio"...

Por un lado tenemos

Código SQL [-]
update ventas_new a set a.nombre =

Esa parte de la consulta esta esperando un valor, que puede ser cualquiera, en nuestro caso es...

Código SQL [-]
(select b.nombre from ventas_old b where b.id = a.id)

- Ahora bien, si hacemos un ejercicio mental de quitar la subconsulta e imaginarnos que nos devuelve un valor cualquiera, por ejemplo "Jhonny", obtendriamos la siguiente consulta, (Que en ultimas es lo que haria cualquier motor, suponiendo que unicamente me devolvera un solo registro en todos los casos)...

Código SQL [-]
update ventas_new a set a.nombre = 'Jhonny'

Como podemos ver no hay una condición where donde le indique al motor cual es el registro para actualizar, de manera que los actualizara todos .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 28-11-2007 a las 00:32:37.
Responder Con Cita
  #7  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Bueno maeyanes, acabo de hacer una prueba para corroborar el asunto en (FB2.1 Beta 2 - Dialecto3) y me he dado cuenta que vos tenes la razón, aunque aún no cabe dentro de mi logica, definitivamente el efecto es el que vos haz comentado .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 28-11-2007 a las 00:45:48. Razón: Colocar maeyanes
Responder Con Cita
  #8  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Ahhh, Claro¡¡¡ , ¿Como es que no lo habia visto asi? , lo que hace el update es ir "recorriendo" los registros y asignandoles el valor correspondiente, si ponemos un where "recorrera" solo los que esten dentro de la condición, en este caso como no hemos puesto un where los recorrera todos, asignandoles el valor de la subconsulta, que basandome en el ejemplo anterior no siempre tendremos como resultado 'Jhonny', ya que dicha subconsulta tiene su propia condición basada en los datos de la tabla ventas_new (Que es la que queremos actualizar) y traera un valor diferente dependiendo del registro de donde este "ubicado" el cursor al momento de actualizar... Caramba¡¡¡ que descachada me pegue , ahora si que comprendo este asunto con una mejor logica .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 28-11-2007 a las 00:57:04.
Responder Con Cita
  #9  
Antiguo 28-11-2007
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 264
Poder: 21
Rockin Va por buen camino
Gracias maeyanes, lo he probado y me va de puta madre me has ahorrado un monton de tiempo. Cuando vengas por Málaga tienes barra libre pagada.

Saludos
Responder Con Cita
  #10  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Aún asi, creo que en FireBird esta haciendo falta algo (Si es que ya no existe y no me he dado cuenta), ¿Que sucederia si queremos actualizar varios campos de esta manera?, abria que hacer lo siguiente:

Código SQL [-]
update ventas_new a set a.nombre = (select b.nombre from ventas_old b where b.id = a.id), a.apellido = (select b.apellido from ventas_old b where b.id = a.id)

Esto debe ser muy lento... deberia existir una manera de hacerlo diferente... como creo que lo he visto en otros motores, algo como:

Código SQL [-]
update ventas_new a set a.nombre = b.nombre, a.apellido=b.apellido 
from inner join ventas_old b on (b.id = a.id)

No se, quizá es una idea loca y hasta sin sentido, como quizá sea algo que he observado en algún otro lugar, pero creo que deberia existir.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #11  
Antiguo 28-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Yo siempre he usado el update de esa forma y siempre me ha resultado bien... por eso me extrañó que me dijeras que se repetiría lo mismo en todos los registros...

Y si, en algunas ocasiones puede ser lento... sobre todo si son tablas muy grandes...



Saludos...
Responder Con Cita
  #12  
Antiguo 28-11-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 18
Chris Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
Código SQL [-]update ventas_new a set a.nombre = b.nombre, a.apellido=b.apellido
from inner join ventas_old b on (b.id = a.id)
Creo que jhonny está equivocado, o en al final soy yo, porque eso quedaría así:

Código SQL [-]
update ventas_new a set 
a.nombre, a.apellido
values
(Select b.nombre, b.apellido from ventas_old b where (a.id = b.id))
de esta forma solo haríamos una sóla consulta anidada.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #13  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por maeyanes Ver Mensaje
Hola...

Yo siempre he usado el update de esa forma y siempre me ha resultado bien... por eso me extrañó que me dijeras que se repetiría lo mismo en todos los registros...
Bueno, como dicen por ahí, "La practica hace al maestro"
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #14  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por D&W Ver Mensaje
Creo que jhonny está equivocado, o en al final soy yo, porque eso quedaría así:

Código SQL [-]
update ventas_new a set 
a.nombre, a.apellido
values
(Select b.nombre, b.apellido from ventas_old b where (a.id = b.id))
de esta forma solo haríamos una sóla consulta anidada.
Eso, algo asi estaria bien... repito (si es que no existe ya), en el Insert tambien deberia existir algo por el estilo, aunque la verdad es que siempre que he necesitado algo asi, hago un procedimiento almacenado.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #15  
Antiguo 28-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola!

Es posible esa sintaxis en Firebird?

Por que hasta ahora no he visto ningún documento donde indique que si es posible, y haciendo unas pruebas con Firebird 2, obtuve un error...



Saludos...
Responder Con Cita
  #16  
Antiguo 28-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Cita:
Empezado por jhonny Ver Mensaje
Eso, algo asi estaria bien... repito (si es que no existe ya), en el Insert tambien deberia existir algo por el estilo, aunque la verdad es que siempre que he necesitado algo asi, hago un procedimiento almacenado.
Bueno... en el insert si es posible hacer algo así:

Código SQL [-]
/* Ambas tablas tienen los mismos campos con los mismos nombres */
insert into Tabla1 (select * from Tabla2)

/* Usando nombres de campos */
insert into tabla1 (campo1, campo2) (select campo1, campo2 from Tabla2)


Saludos...
Responder Con Cita
  #17  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por maeyanes Ver Mensaje
Hola!

Es posible esa sintaxis en Firebird?

Por que hasta ahora no he visto ningún documento donde indique que si es posible, y haciendo unas pruebas con Firebird 2, obtuve un error...



Saludos...

Ese es el punto... no se puede hacer, pero sería interesante que se pudiera .

En cuanto a lo de la sintaxis que nos muestras sobre el insert, pues te cuento que acabo de hacer una prueba con FB 2.0.3

como la que indicas, pero desafortunadamente con la primero consulta me muestra el siguiente error:

Código SQL [-]
insert into TablaPrueba (select * from TablaPrueba2) /*Tienen la estructura igual*/

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 26.
select.

y con la segunda, lo siguiente:

Código SQL [-]
insert into TablaPrueba (codigo, descripcion) (select codigo, descripcion from TablaPrueba2)

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 48.
(.


Sinceramente, recuerdo vagamente que alguna vez hice algo como lo que indicas, pero como ya he comentado, siempre que necesito estas cosas he usado un procedimiento almacenado por lo que ya no recuerdo si la vez que lo hice fue con FB u otro motor .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #18  
Antiguo 28-11-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Bueno... la verdad es que lo hice de memoria...

Revisando la documentación...

Código SQL [-]
insert into Tabla1 (campo1, campo2, campo3)
  select campo1, campo2, campo3 from Tabla2



Saludos...
Responder Con Cita
  #19  
Antiguo 28-11-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por maeyanes Ver Mensaje
Bueno... la verdad es que lo hice de memoria...

Revisando la documentación...

Código SQL [-]
insert into Tabla1 (campo1, campo2, campo3)
  select campo1, campo2, campo3 from Tabla2
Jojojo, es cierto, de nuevo tienes razón , de hecho tambien es cierto lo otro, asi:

Código SQL [-]
insert into Tabla1 select * from Tabla2

Una solución por el estilo debe tener lo del Update con una sola subconsulta que he planteado mas arriba , pero ni la encuentro y/o ni la recuerdo .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 datos de una tabla según datos de otra. GustavoCruz SQL 10 02-06-2007 00:18:44
Actualizar un campo de una tabla con datos que se encuentran en otra tabla Morphine SQL 4 15-12-2006 23:47:42
Actualizar una tabla con una consulta de otra tabla JODELSA SQL 2 14-09-2006 05:07:01
Actualizar tabla con datos de otra tabla ElDioni SQL 2 02-05-2006 17:04:04
Problema al hacer un update en una tabla con datos de otra Iseberiano SQL 3 08-06-2005 13:32:14


La franja horaria es GMT +2. Ahora son las 13:50:37.


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