Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación, y ofrecer contenidos y publicidad de interés.
Al continuar con la navegación entendemos que se acepta nuestra política de cookies.
Iniciar sesión Cerrar
Correo:
Contraseña:
Entrar
Recordar sesión en este navegador
Iniciar sesiónIniciar sesiónCrear cuentaCrear cuenta

MySQL - update con un select, misma tabla

Vista:
Me gusta: Está pregunta es útil y esta clara
0
No me gusta: Está pregunta no esta clara o no es útil
 
Asunto:

update con un select, misma tabla

Autor:mdhg3 (3 intervenciones)
Fecha:15/05/2008 14:03:45
Hola,
Tengo un problema, ¿alquien me puede ayudar u orientar?

Sentencia:
UPDATE consumo SET kmsalida=(
SELECT kmsalida FROM consumo
WHERE matricula='2087cgc' AND ano=2008 AND mes=2 AND dia=14)
WHERE matricula='2087cgc' AND ano=2008 AND mes=2 AND dia=15

Error que me aparece: #1093 - You can't specify target table 'consumo' for update in FROM clause

He probado a poner alias distintos a la tabla consumo y no funciona. El error se que lo dá por utilizar en el SELECT la misma tabla, pero ¿cómo lo soluciono? Gracias
Responder
información
Otras secciones de LWP con contenido similar...
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Gonzalo GC (339 intervenciones)
Fecha:15/05/2008 15:38:56
No existe solución para lo que quieres hacer. Es un problema de lógica:
No puedes consultar y modificar al mismo tiempo una tabla porque puede darse que la modificación del registro que estás haciendo afecte el resultado de la consulta que estás hacendo para la modificación. En ese caso, ¿en qué estado está el registro: modificado o no?, ¿debe la consulta incluirlo, o no? Si lo estás modificando, entonces no cumple con el predicado por lo tanto no lo debe mostrar, pero si no lo muestra, ¿como lo modificas?
Como se trata de una situación que debe ser resuelta por medio de algoritmos que son usados para TODO TIPO de consultas, y no sólo para esta, el SQL simplemente NO TE DEJARÁ HACERLO JAMÁS.
¿Como se hace entonces?
Bueno, para eso se deben construir tablas transaccionales temporales, donde almacenes las modificaciones, y una vez confirmadas, se usan para actualizar la tabla base.
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:mdhg3 (3 intervenciones)
Fecha:15/05/2008 19:11:47
Gracias por la ayuda. Ya habia visto que no es posible hacerlo, y lo que hice fue crear una tabla con los datos que tengo que consultar y lo realizar el update sobre la tabla origen. Lo dicho muchas gracias de todas formas.
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Patricio Moreno Montero (1 intervención)
Fecha:29/08/2008 12:57:20
Se puede crear la tabla temporal en la misma query, haciendo que todo se quede en una sola. Algo del tipo:

UPDATE tabla SET tabla1.valor1=(SELECT minimo FROM (SELECT MIN(valor2) FROM tabla2 GROUP BY tabla2.valor3 ) as X)

Habrá que tener en cuenta que la subquery mas profunda deberá arrojar un único valor, y que habrá que asignarle un alias, en este caso X
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Luis Enrique Barrera Ojeda (2 intervenciones)
Fecha:19/08/2010 01:48:09
Url:
Mi estimado Patricio, tu ejemplo funciona pero no aplica para el asunto que es hacer un UPDATE a una tabla haciendo uso de un SELECT que consulta a ese misma tabla; lo anterior es debido a que en tu ejemplo estas haciendo un UDPATE a la tabla denominada "tabla" y en el SELECT que usas, nunca estas usando dicha tabla, pero si otras tablas llamadas "tabla1" y "tabla2". Por esta razón si te va a funcionar el UPDATE que intentas ilustrar con ese ejemplo. Adicionalmente en ninguna parte del ejemplo estas creando alguna tabla, ya que tampoco estas usando el comando "CREATE" del grupo de instrucciones DDL que para el caso de creación de tablas es "CREATE TABLE XXX" donde "XXX" es el nombre de la tabla a crear, y mucho menos estas definiendo campos para la tabla a crear. Es posible crear una tabla muy facilmente por medio de "CREATE TABLE XXX AS SELECT...." donde "SELECT..." es una consulta cualquier que se desee usar. Los campos de la tabla a crear así como los tipos de datos y longitudes de los campos son asignados de forma automática por medio de un análsis que MySQL hace a la información generada por la consulta usada.
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Luis Enrique Barrera Ojeda (2 intervenciones)
Fecha:19/08/2010 01:37:37
Url:
Mi estimado Gonzalo GC, tu respuesta es totalmente irrefutable. La lógica que se maneja y con que fue diseñado el lenguaje SQL, fue de esa forma concebida y no importa la complejidad de la consulta que uses en un UPDATE, simplemente no es posible hacerlo (así se usen alias, o se use una consulta sencilla o con consultas anidadas o cualquier variante dentro de la consulta objeto) sin usar tablas temporales que tú muy acertadamente denominas "tablas transaccionales". Aqui les dejo un ejemplo de un UPDATE basado en una consulta que hace referencia a la misma tabla a actualizar:

UPDATE
facturado_conceptos
SET
recaudado_valor_concepto =
(SELECT
IF(facturado_concept.facturado_valor_concepto>0,
(15000/suma_valores_facturados_no_subsidios.suma_valores_facturados_no_subsidios)
*(facturado_concept.facturado_valor_concepto+facturado_concept.saldo_anterior_concepto),0) AS facturado_valor_concepto
FROM
facturado_conceptos AS facturado_concept
JOIN
(SELECT
facturado.codigo_matricula,
facturado.codigo_usuario,
facturado.codigo_periodo,
SUM(IF(facturado.facturado_valor_concepto>0,facturado.facturado_valor_concepto,0))
AS suma_valores_facturados_no_subsidios
FROM
facturado_conceptos AS facturado
WHERE
facturado.codigo_periodo=120
GROUP BY
facturado.codigo_matricula,
facturado.codigo_usuario,
facturado.codigo_periodo)
AS suma_valores_facturados_no_subsidios
ON
(facturado_concept.codigo_matricula = suma_valores_facturados_no_subsidios.codigo_matricula AND
facturado_concept.codigo_usuario = suma_valores_facturados_no_subsidios.codigo_usuario AND
facturado_concept.codigo_periodo = suma_valores_facturados_no_subsidios.codigo_periodo)
WHERE
facturado_concept.codigo_matricula ='01001000' AND
facturado_concept.codigo_usuario ='1000018' AND
facturado_concept.codigo_periodo =120
GROUP BY
facturado_concept.codigo_matricula,
facturado_concept.codigo_usuario,
facturado_concept.codigo_periodo,
facturado_concept.codigo_concepto)
WHERE
facturado_conceptos.codigo_matricula= '01001000' AND
facturado_conceptos.codigo_usuario = '1000018' AND
facturado_conceptos.codigo_periodo = 120
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Epimenio Enrique Parra (1 intervención)
Fecha:17/10/2010 16:53:20
Estas cerrando el parentesis antes
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:mdhg3 (3 intervenciones)
Fecha:18/10/2010 08:23:50
Gracias a todos. Ya solucioné el problema.
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Jairo jairosv@gmail.com (1 intervención)
Fecha:21/08/2011 10:09:57
Compeñero se que es tarde pero porque no intentas script donde creas un cursor donde consulta estos datos luego lo recorres

declare micursor cursor
select id, nombre,salario from empleados;
begin
open micursor
for i each micursor
update salario set salario = salario* comision
where id_empleados= i,empleado;

end for;
mas o menos asi la sintaxis no me acuerdo bien pero debe funcionar
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:oduber vasquez (1 intervención)
Fecha:15/08/2013 16:49:17
todo es posible en la programación yo tenia ese problema y lo resolví realizando una función ejemplo:

creo una funcion returgrupo pasandole un parametro en este caso con una cedula
BEGIN
DECLARE nsi INT;
SELECT COUNT(*) into nsi from tdiario WHERE campunico = ccedula AND Fecha = CURRENT_DATE;
RETURN nsi;
END
y luego en la actualización llamo a la función que me cuanta las cédulas repetidas de la misma fecha o de la fecha actual y de la misma tabla ejemplo:

UPDATE tdiario SET nvalor = (select returgrupo('12288856')),rgbcolor = (select returgrupo('12288856')) WHERE campunico = '12288856' AND Fecha = CURRENT_DATE

con esto logre hacer lo que quería
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

RE:update con un select, misma tabla

Autor:Angel Campaña (1 intervención)
Fecha:05/08/2014 23:20:05
Tuve un problema similar, tenia una tabla al que deseaba hacerle un select agrupando por un campo y el resultado colocarlo en la misma tabla, lo unico que me resulto fue nombrar a la primera tabla y luego como segunda tabla un select a la misma tabla agrupando los campos que deseaba.

UPDATE sx_tmprpt1, (SELECT campo2, sum(campo26) as Col1, sum(campo27) as Col2 FROM sx_tmprpt1 where ctrl_repor='karlaSico_DiarioResumido503:54:37 p.m.' group by campo2) as T2
SET sx_tmprpt1.campo31 = T2.Col1, campo32 = T2.Col2
WHERE T2.campo2 = sx_tmprpt1.campo2
Comentar