¿Cómo hacer 3 table JOIN en la consulta UPDATE?

466

Hice una pregunta y obtuve esta respuesta que ayudó.

   UPDATE TABLE_A a JOIN TABLE_B b 
   ON a.join_col = b.join_col AND a.column_a = b.column_b 
   SET a.column_c = a.column_c + 1

Ahora estoy buscando hacer esto si hay 3 tablas involucradas en algo como esto.

    UPDATE tableC c JOIN tableB b JOIN tableA a

mi pregunta es básicamente ... ¿es posible hacer 3 table join en una UPDATEdeclaración? y cuál es la sintaxis correcta para ello? Gracias. ¿Hago el ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA
Ricky
fuente
2
Claro que es posible. Darle una oportunidad. La sintaxis es tal como la tiene: solo necesita agregar el siguiente JOINy su ONcondición, igual que lo haría en una SELECTconsulta.
Michael Berkowski
2
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'
Michael Berkowski
1
La pregunta mencionada está aquí: stackoverflow.com/questions/15206746/…
Urs

Respuestas:

810

la respuesta es yesque puedes

pruébalo así

UPDATE TABLE_A a 
    JOIN TABLE_B b ON a.join_col = b.join_col AND a.column_a = b.column_b 
    JOIN TABLE_C c ON [condition]
SET a.column_c = a.column_c + 1

EDITAR:

Para la actualización general, únete:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]
echo_Me
fuente
2
Sin embargo, lo extraño es que mi software HeidiSQL informa cero filas afectadas, aunque los datos muestran que las actualizaciones se realizaron.
Pianoman
1
@Pianoman Para mí también sucedió y tenía algo que ver con ON UPDATE CURRENT_TIMESTAMP, simplemente agregué manualmente la actualización y la arreglé, solo diciendo si le sucede a alguien más
eric.itzhak
Si necesita una ayuda visual para que sus uniones sean correctas: explore-tutorials.com/tutorial/mysql-joins-visual-representation
ram4 el
Creo que lo siguiente es un plan general mejor: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(perdóneme si este maldito editor no me permite ingresar a nuevas líneas sin hacer una publicación completa)
UncaAlby
Donde esta WHERE?? O WHEREno es posible?
Verde
42

Una forma alternativa de lograr el mismo resultado es no usar JOINpalabras clave en absoluto.

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col
Matas Vaitkevicius
fuente
3
Probé esto en 5.5.62 y mysql no me gustó la sintaxis. Según el manual [ dev.mysql.com/doc/refman/5.6/en/update.html] , la consulta debe ser:UPDATE TABLE_A, TABLE_B SET TABLE_A.column_c = TABLE_A.column_c +1 WHERE TABLE_A.join_col = TABLE_B.join_col
Noe Nieto
77
Esto hace una implícita JOINde la misma manera que hace SELECT * FROM TABLE_A, TABLE_B ...lo hace
Madbreaks
Entonces, ¿eso significa que en 5.5 solo se acepta el formulario de combinaciones implícitas para la actualización?
userfuser
@userfuser No, no lo hace, el manual establece la sintaxis: más UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]adelante, el manual establece: "La table_referencescláusula enumera las tablas involucradas en la unión. Su sintaxis se describe en la Sección 13.2.9.2, Sintaxis de UNIÓN ".
hmundt
44
No es exactamente el mismo resultado: puede hacer combinaciones izquierdas con la sintaxis de combinación.
Gerard ONeill
10

A continuación se muestra la consulta de actualización que incluye JOINy WHEREambos. Del mismo modo que podemos usar la cláusula de unión múltiple / dónde, espero que te ayude: -

UPDATE opportunities_cstm oc JOIN opportunities o ON oc.id_c = o.id
 SET oc.forecast_stage_c = 'APX'
 WHERE o.deleted = 0
   AND o.sales_stage IN('ABC','PQR','XYZ')
Nitin Shukla
fuente
3
¡Bienvenido a Stack Overflow! Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada mejoraría en gran medida su valor educativo al mostrar por qué esta es una buena solución al problema y la haría más útil para futuros lectores con preguntas similares, pero no idénticas. Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight
2

Un plan general alternativo, que solo estoy agregando como una respuesta independiente porque el "comentario sobre una respuesta" no tomará nuevas líneas sin publicar la edición completa, aunque aún no esté terminado.

UPDATE table A
JOIN table B ON {join fields}
JOIN table C ON {join fields}
JOIN {as many tables as you need}
SET A.column = {expression}

Ejemplo:

UPDATE person P
JOIN address A ON P.home_address_id = A.id
JOIN city C ON A.city_id = C.id
SET P.home_zip = C.zipcode;
UncaAlby
fuente
1

Para el ejemplo de PostgreSQL:

UPDATE TableA AS a
SET param_from_table_a=FALSE -- param FROM TableA
FROM TableB AS b
WHERE b.id=a.param_id AND a.amount <> 0; 
M1er
fuente