MySQL Actualizar Una Tabla Unida


Quiero actualizar una tabla en una sentencia que tiene varias uniones. Si bien sé que el orden de las uniones no importa realmente (a menos que esté utilizando sugerencias de optimizador), las ordené de cierta manera para que sean más intuitivas de leer. Sin embargo, esto resulta en que la tabla que quiero actualizar no es la que comienzo, y estoy teniendo problemas para actualizarla.

Un ejemplo ficticio de lo que me gustaría hacer es algo como:

UPDATE b
FROM tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

Hay muchas publicaciones sobre la actualización con joins aquí sin embargo, siempre tienen la tabla que se actualiza primero. Sé que esto es posible en SQL Server y espero que sea posible en MySQL También!

Author: Bill Karwin, 2011-11-30

3 answers

La sintaxis de ACTUALIZACIÓN de varias tablas en MySQL es diferente de Microsoft SQL Server. No necesita decir qué tabla(s) está actualizando, eso está implícito en su cláusula SET.

UPDATE tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

No hay ninguna cláusula FROM en la sintaxis de MySQL.

UPDATE with JOIN no es SQL estándar, y tanto MySQL como Microsoft SQL Server han implementado sus propias ideas como una extensión de la sintaxis estándar.

 82
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-23 17:24:43

Usted tiene el orden de las declaraciones mal. Puedes leer la sintaxis aquí (lo sé, es bastante difícil de leer.

UPDATE tableA a
  JOIN tableB b
    ON a.a_id = b.a_id
  JOIN tableC c
    ON b.b_id = c.b_id
   SET b.val = a.val+c.val
 WHERE a.val > 10
   AND c.val > 10;

Sql fiddle

 3
Author: Andreas Wederbrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-13 17:01:48

Este link debería darte la sintaxis que MySQL necesita y aquí es un ejemplo. ¿Por qué necesitas unirte a las dos mesas? es para limitar los registros actualizados? Te lo pregunto porque también puedes hacer algo como lo siguiente:

update B set B.x=<value>
    where 
B.<value> is in(
    select A.y 
      from A left outer join B on A.<value>=B.<value>
)
 0
Author: John Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 19:34:01