Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sentencia UPDATE (https://www.clubdelphi.com/foros/showthread.php?t=36353)

kikecg 09-10-2006 17:36:56

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.

maeyanes 09-10-2006 17:47:59

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...

mensana 09-10-2006 17:48:10

Si no te funciona el ROWS n, prueba a usar GROUP BY y HAVING para obligar a que te devuelva una sola fila

kikecg 13-10-2006 17:30:41

Solucionado
 
Hola.

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

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.

Paoti 13-10-2006 18:23:31

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.

kikecg 16-10-2006 11:23:24

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.


La franja horaria es GMT +2. Ahora son las 00:57:52.

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