Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Update + select con mas de un row

Estas en el tema de Update + select con mas de un row en el foro de Mysql en Foros del Web. Hola tengo la siguiente linea dentro de un procedure UPDATE GVIAJES.ADELANTO SET ADEDescontado=0 WHERE ADEId=(SELECT ADEId from SUELDO_ADELANTOS AS SA INNER JOIN SUELDO AS S ...
  #1 (permalink)  
Antiguo 08/07/2011, 22:34
uv3
 
Fecha de Ingreso: noviembre-2009
Mensajes: 31
Antigüedad: 14 años, 4 meses
Puntos: 0
Update + select con mas de un row

Hola tengo la siguiente linea dentro de un procedure

UPDATE GVIAJES.ADELANTO SET ADEDescontado=0 WHERE ADEId=(SELECT ADEId from SUELDO_ADELANTOS AS SA INNER JOIN SUELDO AS S ON SA.SUEId=S.SUEId WHERE S.SUEId=xSUEId);

xSUEId es un entero lo recibo por parametro.

Resulta que el SELECT devuelve mas de un ADEId, y es por eso es que el update no me funciona. Qusiera saber si hay alguna forma sencilla de hacerlo o debo usar cursores para recorrer los resultados del SELECT y por cada linea efectuar el update.
  #2 (permalink)  
Antiguo 09/07/2011, 06:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update + select con mas de un row

Tal vez así:
Código MySQL:
Ver original
  1.         GVIAJES.ADELANTO A
  2.         INNER JOIN
  3.         SUELDO_ADELANTOS SA ON A.ADEId = SA.ADEId  
  4.         INNER JOIN
  5.         SUELDO S ON SA.SUEId=S.SUEId
  6. SET A.ADEDescontado=0
  7. WHERE S.SUEId=xSUEId;
Lo que no queda claro es de dónde sale xSUEId.
¿Es una variable o es una columna perteneciente a una tabla?
La duplicidad de valores devueltos puede darse porque si un empleado a recibido más de un adelanto de sueldo, eso no lo estás considerando.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/07/2011, 07:53
uv3
 
Fecha de Ingreso: noviembre-2009
Mensajes: 31
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Update + select con mas de un row

xSUEId es un parametro (int) que recibe el procedure en el que uso esa linea. Lo voy a probar y te contaré un poco más de que se trata.

Muy bien me funcionó a la perfección, muchas gracias.

El siguiente procedure es el que uso para liquidar el sueldo de un chofer :

Código MySql:
Ver original
  1. drop procedure if exists altaSueldo;
  2. delimiter $$
  3. CREATE procedure altaSueldo (SUEId int, xCHOId int, fecha varchar(45), monto decimal (9,2), xCHOSueldo decimal (9,2))
  4.      BEGIN
  5.         INSERT INTO GVIAJES.SUELDO (SUEId, CHOId, SUEFecha, SUEMonto, CHOSueldo) values (SUEId, xCHOId, fecha, monto,xCHOSueldo);
  6.         INSERT INTO GVIAJES.SUELDO_VIAJES (SUEId, VIAId) (SELECT SUEId, VIAId from VIAJE where CHOId=xCHOId and VIAPago=0);
  7.         INSERT INTO GVIAJES.SUELDO_ADELANTOS (SUEId, ADEId) (SELECT SUEId, ADEId from ADELANTO where CHOId=xCHOId and ADEDescontado=0);
  8.         INSERT INTO GVIAJES.SUELDO_BIATICOS(SUEId, BIAId) (SELECT SUEId, BIAId from BIATICO where CHOId=xCHOId and BIADescontado=0);
  9.         UPDATE GVIAJES.VIAJE SET VIAPago=1 where CHOId=xCHOId;
  10.         UPDATE GVIAJES.ADELANTO SET ADEDescontado=1 where CHOId=xCHOId;
  11.         UPDATE GVIAJES.BIATICO SET BIADescontado=1 where CHOId=xCHOId;
  12.      END;
  13. $$
  14. delimiter ;

Y con el siguiente procedure lo que quiero es revertir el sueldo (en caso de liquidar por error) y volver todo a la normalidad.

Código MySql:
Ver original
  1. drop procedure if exists eliminarSueldo;
  2. delimiter $$
  3. CREATE procedure eliminarSueldo (xSUEId int)
  4.      BEGIN
  5.      
  6.       UPDATe GVIAJES.ADELANTO A
  7.               INNER JOIN
  8.               SUELDO_ADELANTOS SA ON A.ADEId = SA.ADEId  
  9.               INNER JOIN
  10.               SUELDO S ON SA.SUEId=S.SUEId
  11.       SET A.ADEDescontado=0 WHERE S.SUEId=xSUEId;
  12.      
  13.       UPDATe GVIAJES.BIATICO B
  14.               INNER JOIN
  15.               SUELDO_BIATICOS SB ON B.BIAId = SB.BIAId  
  16.               INNER JOIN
  17.               SUELDO S ON SB.SUEId=S.SUEId
  18.       SET B.BIADescontado=0 WHERE S.SUEId=xSUEId;
  19.      
  20.       UPDATe GVIAJES.VIAJE V
  21.               INNER JOIN
  22.               SUELDO_VIAJES SV ON V.VIAId = SV.VIAId  
  23.               INNER JOIN
  24.               SUELDO S ON SV.SUEId=S.SUEId
  25.       SET V.VIAPago=0 WHERE S.SUEId=xSUEId;
  26.      
  27.         DELETE FROM GVIAJES.SUELDO_ADELANTOS WHERE SUEID=xSUEId;
  28.         DELETE FROM GVIAJES.SUELDO_BIATICOS WHERE SUEID=xSUEId;
  29.         DELETE FROM GVIAJES.SUELDO_VIAJES WHERE SUEID=xSUEId;
  30.         DELETE FROM GVIAJES.SUELDO WHERE SUEID=xSUEId;
  31.        
  32.     END;
  33. $$
  34. delimiter ;

Muchas gracias. Ya de paso te copio la indentacion que esta muy prolija.

Última edición por uv3; 09/07/2011 a las 08:15

Etiquetas: row, select, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:16.