2011-11-30 17 views
29

Quiero actualizar una tabla en una declaración que tiene varias combinaciones. Aunque sé que el orden de las uniones realmente no importa (a menos que esté usando sugerencias de optimizador), las ordené de cierta manera para que sean más intuitivas de leer. Sin embargo, esto hace que la tabla que quiero actualizar no sea la que empiezo, y tengo problemas para actualizarla.Actualización de MySql Una tabla unida

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 muchos mensajes acerca de la actualización con une aquí, sin embargo siempre tienen tabla que se actualiza en primer lugar. Sé que esto es posible en SQL Server y espero que también sea posible en MySQL.

+0

Debe colocar 'SET b.val = a.val + c.val' antes de' FROM ... '. Consulte http://stackoverflow.com/questions/2334712/sql-server-update-from-select – Gerben

+0

Este ejemplo tiene SET después de from, y esos ejemplos actualizan la primera tabla en el orden de unión. Me gustaría actualizar una tabla en el medio del orden de unión. – Zugwalt

+0

Eso no debería importar. Incluso si lo hiciera, podría cambiar el orden de las uniones ('tableB b JOIN tableA a ON a.a_id = b.a_id'). – Gerben

Respuesta

78

La sintaxis ACTUALIZACIÓN multi-tabla en MySQL es diferente de Microsoft SQL Server. No es necesario decir qué tabla (s) está actualizando, que está implícita 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 existe cláusula FROM en la sintaxis de MySQL.

ACTUALIZAR con 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.

+0

ORDER BY y LIMIt no usar en join's – zloctb

+0

@zloctb, sí, ¡es un buen consejo! Por alguna razón, la sintaxis UPDATE multi-tabla de MySQL no admite ORDER BY y LIMIT. Cf. http://dev.mysql.com/doc/refman/5.6/en/update.html –

0

Este link debería darle la sintaxis que necesita MySQL y here es un ejemplo. ¿Por qué necesitas unirte a las dos mesas? ¿es para limitar los registros actualizados? Lo estoy preguntando porque también puede 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

Ese ejemplo actualiza la primera tabla en el orden de unión. Me gustaría actualizar una tabla en el medio del orden de unión. – Zugwalt

3

Tiene el orden de las declaraciones incorrecto. Puede leer sobre la sintaxis here (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

+1

Esa sintaxis no funciona. Tendría que eliminar la parte FROM y mover la parte SET después de JOINs. – draca

+0

Tiene razón, lo cambié a algo que funciona. –

Cuestiones relacionadas