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

Update con select anidado - Error

Estas en el tema de Update con select anidado - Error en el foro de Mysql en Foros del Web. Esta es la estructura de la tabla id_t nombre tarifa oficio id_supv 1235 M. FARADAY 12,5 ELECTRICISTA 1311 1311 C. COULOMB 15,5 ELECTRICISTA 1311 1412 ...
  #1 (permalink)  
Antiguo 21/06/2010, 16:40
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 10 meses
Puntos: 0
Update con select anidado - Error

Esta es la estructura de la tabla
id_t nombre tarifa oficio id_supv
1235 M. FARADAY 12,5 ELECTRICISTA 1311
1311 C. COULOMB 15,5 ELECTRICISTA 1311
1412 C. NEMO 13,75 FONTANERO 1520
1520 H. RICKOVER 11,75 FONTANERO 1520
2920 R.GARRET 10 ALBAÑIL 2920
3001 J.BARRISTER 8,2 CARPINTERO 3231
3231 P.MASON 17,4 CARPINTERO 3231

la consulta a resolver es esta
Incrementar un 5% la tarifa de todos los trabajadores que supervisa C. COULOMB

la resuelvo de la siguiente forma
UPDATE `trabajador`
SET tarifa = tarifa * 1.05
WHERE id_supv = (SELECT id_t
FROM `trabajador`
WHERE nombre = 'C.COULOMB')

da el siguiente error
You can't specify target table 'trabajador' for update in FROM clause

por lo que vi en mysql no se puede utilizar la misma tabla en el from del select anidado del update. o sea no se puede seleccionar de la misma tabla de la cual se va actualizar.
como se podria resolver ? busque en google pero nada me convencio y/o ayudo.
gracias.
  #2 (permalink)  
Antiguo 21/06/2010, 21:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Update con select anidado - Error

Creo que te faltan datos.
Lo que no entiendo es de dónde sacas id_supv. No veo la tabla donde se halla ese campo id_supv. En el UPDATE tendrías que hacer una unión con INNER JOIN entre la tabla trabajador y esa tabla para poder buscar ese id_supv que deseas. Dinos la estructura de la otra tabla y cómo se establece la relación.
  #3 (permalink)  
Antiguo 21/06/2010, 21:42
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, 5 meses
Puntos: 2658
Respuesta: Update con select anidado - Error

Además de que no puedes leer una tabla y escribirla al mismo tiempo en MySQL, la subconsulta es irrelevante si ya el campo nombre tiene la selectividad para encontrar el registro:
Código MySQL:
Ver original
  1. UPDATE `trabajador`
  2. SET tarifa = tarifa * 1.05
  3. WHERE nombre = 'C.COULOMB';
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 21/06/2010, 21:57
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Update con select anidado - Error

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Además de que no puedes leer una tabla y escribirla al mismo tiempo en MySQL, la subconsulta es irrelevante si ya el campo nombre tiene la selectividad para encontrar el registro:
Código MySQL:
Ver original
  1. UPDATE `trabajador`
  2. SET tarifa = tarifa * 1.05
  3. WHERE nombre = 'C.COULOMB';
ese update actualiza unicamente a C.COULOMB,
el query era este "Incrementar un 5% la tarifa de todos los trabajadores que supervisa C. COULOMB" o sea a los que supervisa C.COULOMB es decir (viendo la tabla)
el 1235 y si mismo (1311)

jurena, id_supv es el ultimo campo de la tabla

como se podria resolver esta consulta?, con una tabla temporal?
de ser asi como se implementaria?
  #5 (permalink)  
Antiguo 21/06/2010, 22:49
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Update con select anidado - Error

esta solucion le encontre, usar una tabla temporaria...

CREATE TABLE `temp` (
`id_t` int(11) NOT NULL,
`nombre` varchar(30) NOT NULL,
`tarifa` float(11,0) NOT NULL,
`oficio` varchar(30) NOT NULL,
`id_supv` int(11) NOT NULL,
PRIMARY KEY (`id_t`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO temp
SELECT id_t, nombre, tarifa, oficio, id_supv
FROM `trabajador`
WHERE id_supv = (SELECT id_t
FROM `trabajador`
WHERE nombre = 'C. COULOMB');

UPDATE `trabajador`
SET tarifa = tarifa * 1.05
WHERE id_supv = (SELECT id_t
FROM temp
WHERE nombre = 'C. COULOMB');


DROP TABLE `temp`;

Última edición por mysql; 21/06/2010 a las 22:51 Razón: formato

Etiquetas: select, update, anidados
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 14:44.