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 09-10-2006
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
Sentencia UPDATE

Hola.

Necesito hacer un UPDATE a un campo de una tabla tomando como valor un campo de otra tabla. El problema con el que me encuentro es que en la tabla de la que tomo los valores se pueden dar multiples registros por cada uno de la tabla a actualizar.

Algo así:


Código SQL [-]
UPDATE TABLA1 TB1 SET TB1.SENDER_POINT = (SELECT SENDER_POINT FROM TABLA2 WHERE ID_GIRO = TB1.ID_GIRO)



Esto me devuelve Multiple rows in sigleton select.

He probado a añadir ROWS 1 en la sentencia SELECT:



Código SQL [-]
UPDATE TABLA1 TB1 SET TB1.SENDER_POINT = (SELECT SENDER_POINT FROM TABLA2 WHERE ID_GIRO = TB1.ID_GIRO ROWS 1)



Pero entonces el resultado es:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 64.
ROWS.


Necesito hacer esta actualización ya que le campo SENDER_POINT de la tabla a actualizar no existía en un principio, y ahora hay que actualizarlo con el dato correcto. El problema es que son demasiados registros para hacerlo manualmente.

¿Alguien me puede dar alguna idea de como escribir la sentencia para que me haga la actualización?, ¿o no se puede hacer directamente en una consulta?.

Ah!, todo esto trabajando en Interbase 7.5.

Muchas gracias.
Responder Con Cita
  #2  
Antiguo 09-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Prueba con DISTINCT:

Código SQL [-]
UPDATE TABLA1 TB1 SET TB1.SENDER_POINT = (SELECT DISTINCT SENDER_POINT FROM TABLA2 WHERE ID_GIRO = TB1.ID_GIRO)

Saludos...
Responder Con Cita
  #3  
Antiguo 09-10-2006
mensana mensana is offline
Miembro
 
Registrado: sep 2006
Posts: 69
Poder: 18
mensana Va por buen camino
Si no te funciona el ROWS n, prueba a usar GROUP BY y HAVING para obligar a que te devuelva una sola fila
Responder Con Cita
  #4  
Antiguo 13-10-2006
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
Smile Solucionado

Hola.

Con el DISTINCT me daba el mismo problema, el de multiple... Con group by no había manera de hacerlo.

Al final he tenido que hacer tres consultas en 1. De dentro hacia afuera, en la primera obtengo el MAX id de la tabla de la que saco los datos para cada registro que voy a actualizar. En la segunda saco el dato SENDER_POINT donde ID = al obtenido en la consulta anterior. Y por ultimo la tercera coonsulta hace el UPDATE en si.

Algo así:

Código SQL [-]
UPDATE TABLA1 TB1 SET TB1.SENDER_POINT = (SELECT SENDER_POINT FROM TABLA2
WHERE ID_TABLA = (SELECT MAX(ID_TABLA) FROM TABLA3
WHERE ID_TABLA = TB1.ID_GIRO AND (SENDER_POINT <> '' AND SENDER_POINT IS NOT NULL)))
WHERE (TB1.SENDER_POINT IS NULL OR TB1.SENDER_POINT = '')

De esta manera funcionó perfectamente (eso si... tomandose su tiempo).

Gracias de todas formas.
Responder Con Cita
  #5  
Antiguo 13-10-2006
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
ammmh


asi a vista de ojos de buen cubero y malo para las bases de datos


debes de tener cuidado.

Código SQL [-]
SELECT DISTINCT SENDER_POINT FROM TABLA2 WHERE ID_GIRO = TB1.ID_GIRO


no necesariamente SENDER_POINT debe ser unico para cualquier registro donde ID_GIRO sea igual a tu tabla maestra donde quieres ser el update.


tu solucin al final si que es algo rara, ya que no conozco su estructura, pero cuando necesites ahcer este tipos de updates, o inserts, procura vinvular tola la llave primaria de la tabla maestra con la otra tabla de donde quieres obtener datos.
__________________
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
  #6  
Antiguo 16-10-2006
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
No problem

Hola.

El dato en SENDER_POINT es único para cada ID_GIRO, así que por ese lado no hay problema. Lo que sucede es que en la tabla 2 efectivamente se dan n registros por cada ID_GIRO. Pero ese dato siempre ha de ser el mismo.

En cualquier caso se trataba de una sentencia puntual, dado que en un principio en la tabla 1 no era necesario ese dato, a partir de ahora si que lo es. Este UPDATE se ha ejecutado sólo una vez, en adelante no es necesario dado que SENDER_POINT ya recibe el valor correcto al hacer el INSERT.

Saludos.
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
Uso de IN en una sentencia SQL gaby_stars SQL 7 03-09-2006 09:41:21
Sentencia SUM geovany SQL 2 29-10-2004 23:52:24
Como crear una sentencia SQL (Insert, update y delete) sitrico Conexión con bases de datos 1 14-10-2004 00:02:42
sentencia sql??? empty SQL 3 07-04-2004 11:01:32
Consulta en sql con la sentencia IN? danytorres SQL 6 23-09-2003 13:12:14


La franja horaria es GMT +2. Ahora son las 12:29:39.


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