Como fazer 3 tabela JOIN na consulta UPDATE?

466

Fiz uma pergunta e recebi esta resposta que ajudou.

   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

Agora, estou procurando fazer isso se houver 3 tabelas envolvidas, algo como isto.

    UPDATE tableC c JOIN tableB b JOIN tableA a

minha pergunta é basicamente ... é possível fazer 3 tabelas em uma UPDATEdeclaração? e qual é a sintaxe correta para isso? Obrigado. Eu faço o ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA
Ricky
fonte
2
Claro que é possível. De uma chance. A sintaxe é exatamente como você a possui - você só precisa adicionar a próxima JOINe sua ONcondição, da mesma forma que faria em uma SELECTconsulta.
22813 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'
22813 Michael Berkowski
1
O mencionado questão é aqui: stackoverflow.com/questions/15206746/...
Urs

Respostas:

810

a resposta é que yesvocê pode

tente assim

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 atualização geral, junte-se:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]
echo_Me
fonte
2
O mais estranho é que meu software HeidiSQL reporta zero linhas afetadas, embora os dados mostrem que as atualizações foram feitas.
Pianoman
1
@Pianoman Para mim, isso aconteceu tão bem e que tinha algo a ver com a ON UPDATE CURRENT_TIMESTAMP, eu só adicionado manualmente a actualização e fixa-lo, apenas dizendo que se isso acontece com qualquer outra pessoa
eric.itzhak
Se você precisar de uma ajuda visual para obter a sua junta-se correta: browse-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd
Eu acho que o seguinte é um melhor Plano Geral: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(perdoe-me se este editor Blasted não vai me deixar entrar novas linhas sem fazer um post completo)
UncaAlby
Onde esta WHERE?? Ou WHEREnão é possível?
Verde
42

Uma maneira alternativa de alcançar o mesmo resultado é não usar JOINpalavra-chave.

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
fonte
3
Eu tentei isso no 5.5.62 e o mysql não gostou da sintaxe. De acordo com o manual [ dev.mysql.com/doc/refman/5.6/en/update.html] , a consulta deve 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
7
Isto faz um implícita JOINda mesma forma fazendo SELECT * FROM TABLE_A, TABLE_B ...faz
Madbreaks
Então, isso significa que no 5.5 apenas o formulário de junções implícitas é aceito para atualização?
Userfuser
@userfuser Não, o manual declara a sintaxe: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Posteriormente, o manual declara: "A table_referencescláusula lista as tabelas envolvidas na junção. Sua sintaxe é descrita na Seção 13.2.9.2, JOIN Syntax ."
precisa saber é
4
Não é exatamente o mesmo resultado - você pode fazer junções esquerdas com a sintaxe de junção.
precisa
10

Abaixo está a consulta Atualização, que inclui JOIN& WHEREambos. Da mesma forma que podemos usar a cláusula join / where múltipla, espero que ajude você: -

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
fonte
3
Bem-vindo ao Stack Overflow! Obrigado por este trecho de código, que pode fornecer ajuda imediata. Uma explicação adequada melhoraria bastante seu valor educacional, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com perguntas semelhantes, mas não idênticas. Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
perfil completo de Toby Speight
2

Um plano geral alternativo, que estou adicionando apenas como resposta independente, porque o "comentário sobre uma resposta" não levará novas linhas sem postar a edição inteira, mesmo que ainda não tenha 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}

Exemplo:

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
fonte
1

Para o exemplo do 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; 
Mс1er
fonte