La Web del Programador: Comunidad de Programadores
https://www.lawebdelprogramador.com/foros/MySQL/975509-update-con-un-select-misma-tabla.html

update con un select, misma tabla

update con un select, misma tabla

Publicado por mdhg3 (4 intervenciones) el 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

RE:update con un select, misma tabla

Publicado por Gonzalo GC (339 intervenciones) el 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.

RE:update con un select, misma tabla

Publicado por mdhg3 (4 intervenciones) el 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.

RE:update con un select, misma tabla

Publicado por Patricio Moreno Montero (1 intervención) el 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

RE:update con un select, misma tabla

Publicado por Luis Enrique Barrera Ojeda (2 intervenciones) el 19/08/2010 01:48:09
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.

RE:update con un select, misma tabla

Publicado por Luis Enrique Barrera Ojeda (2 intervenciones) el 19/08/2010 01:37:37
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

RE:update con un select, misma tabla

Publicado por Epimenio Enrique Parra (1 intervención) el 17/10/2010 16:53:20
Estas cerrando el parentesis antes

RE:update con un select, misma tabla

Publicado por mdhg3 (4 intervenciones) el 18/10/2010 08:23:50
Gracias a todos. Ya solucioné el problema.

RE:update con un select, misma tabla

Publicado por Jairo (1 intervención) el 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

RE:update con un select, misma tabla

Publicado por oduber vasquez (1 intervención) el 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

RE:update con un select, misma tabla

Publicado por Angel Campaña (1 intervención) el 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

RE:update con un select, misma tabla

Publicado por roimar urbano (1 intervención) el 28/05/2015 19:57:53
como lo solucionaste, yo estoy en las mismas, necesito seleccionar un campo de una tabla y al mismo tiempo actualizarlo

RE:update con un select, misma tabla

Publicado por mdhg3 (4 intervenciones) el 29/05/2015 07:54:29
Lo solucioné utilizando la tabla donde tengo que hacer el SELECT y el UPDATE como tablas distintas, una tabla para el update y otra para el select, te dejo un ejemplo:

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

update con un select, misma tabla

Publicado por Aldo Zegarra (1 intervención) el 09/09/2016 00:21:44
En SQL SERVER si es factible, yo tengo un update de una tabla q toma el valor de respuesta de una misma tabla

1
2
3
4
5
6
7
8
9
10
select @CodCompraD = max(pnCodCompraD) from ComprasD
Update ComprasD set dnCodigo =
	(SELECT (PC.pnCodCategoria*100000000 + PT.pnCodTipoProducto*1000000 + CD.pnCodCompraD) as Codigo
	from ComprasD CD
	Inner join ProductoTipo PT on (PT.pnCodTipoProducto = CD.fnCodTipoProducto)
	Inner join ProductoCategoria PC on ( PC.pnCodCategoria = PT.fnCodCategoria)
	Inner Join ProductoEstado PE on (PE.pnProductoEstado = CD.fnProductoEstado)
	where pnCodCompraD = @CodCompraD
	)
where pnCodCompraD = @CodCompraD