Necesito actualizar una lista de registros provenientes de una declaración SELECT que estoy tratando con algo de este tipo pero recibí errores con respecto al formato de la declaración:

UPDATE
noleggio_veicoli
SET
data_esportazione = CURDATE()
WHERE id IN
(SELECT id FROM noleggio_veicoli WHERE id_convenzionato = 3);

Pero solo regresa:

Código de error: 1093. No puede especificar la tabla de destino 'noleggio_veicoli' para actualizar en la cláusula FROM

Parece que MySQL solo puede ejecutar el clásico UPDATE es decir:

UPDATE
    noleggio_veicoli
SET 
    data_esportazione = CURDATE()
WHERE
    id_convenzionato = 3;

Desafortunadamente, esto no es lo que necesito ya que la consulta SELECT que necesito encadenar a la declaración UPDATE es más compleja y depende de Vistas ya definidas en el servidor SQL.

-1
weirdgyn 8 sep. 2018 a las 14:37

5 respuestas

La mejor respuesta

Como dijo @Maxim, deberías hacer algo como

CREATE TEMPORARY TABLE IF NOT EXISTS temp AS (
  SELECT id FROM noleggio_veicoli where id_convenzionato=3
);

update noleggio_veicoli set data_esportazione=curdate() 
where id in (select id from temp); 
1
cars10m 8 sep. 2018 a las 12:10

Por alguna extraña razón, MySql no permite hacer referencia a la misma tabla que actualiza en una subconsulta de primer nivel.

Pero puede evitarlo a través de una subconsulta de inicio. (Probablemente no sea una palabra real)
Es decir. utilizando una subconsulta en la subconsulta.

Ejemplo usando un IN:

UPDATE noleggio_veicoli
SET data_esportazione = current_date
WHERE id IN (select id from (select id from noleggio_veicoli where id_convenzionato = 3) q);

Funciona también con una EXISTS:

UPDATE noleggio_veicoli as t
SET data_esportazione = current_date
WHERE EXISTS 
(
    select 1 
    from (select id, id_convenzionato from noleggio_veicoli) as t2
    where t2.id_convenzionato = 2
      and t2.id = t.id
);

Puede probarlo aquí en rextester

0
LukStorms 8 sep. 2018 a las 12:49

No puede actualizar y leer desde una tabla al mismo tiempo. Al principio debes seleccione los identificadores necesarios y guárdelos en algún lugar, por ejemplo, en tabla temporal

-1
Maksym Fedorov 8 sep. 2018 a las 11:46

Si desea actualizar los datos que coinciden con select p.id from parent p inner join child c on c.pid=p.id left join child2 c2 on c.x=c2.y where c.xx=yy and p.x=y..., puede hacer algo como:

update parent p 
  set aaa=bbbb 
  from child c 
  left join child2 c2 on c.x=c2.y
  where c.pid=p.id and c.xx=yy and p.x=y ...
0
wargre 8 sep. 2018 a las 11:53

Puedes especificar esto con una join:

UPDATE noleggio_veicoli nv JOIN
       noleggio_veicoli nv3
       ON nv.id = nv3.id and nvid3.id_convenzionato = 3
    SET data_esportazione = curdate();
0
Gordon Linoff 8 sep. 2018 a las 12:15