Come eseguire 3 tabelle JOIN nella query UPDATE?


466

Ho fatto una domanda e ho ottenuto questa risposta che mi ha aiutato.

   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

Ora sto cercando di fare questo se ci sono 3 tavoli coinvolti qualcosa del genere.

    UPDATE tableC c JOIN tableB b JOIN tableA a

la mia domanda è fondamentalmente ... è possibile fare un 3 table join su una UPDATEdichiarazione? e qual è la sintassi corretta per questo? Grazie. Faccio il ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
Sicuro è possibile Provaci. La sintassi è proprio come ce l'hai - devi solo aggiungere la successiva JOINe le sue ONcondizioni, proprio come faresti in una SELECTquery.
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 domanda menzionata è qui: stackoverflow.com/questions/15206746/…
Urs

Risposte:


810

la risposta è yesche puoi

provalo così

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

MODIFICARE:

Per un aggiornamento generale join:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]

2
La cosa strana è tuttavia che il mio software HeidiSQL riporta zero righe interessate, anche se i dati mostrano che gli aggiornamenti sono stati eseguiti.
Pianoman,

1
@Pianoman Anche a me è successo e ha avuto qualcosa a che fare con ON UPDATE CURRENT_TIMESTAMP, ho appena aggiunto manualmente l'aggiornamento e l'ho risolto, dicendo solo se succede a qualcun altro
eric.itzhak,

Se hai bisogno di un aiuto visivo per correggere i tuoi join: browse-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd

Penso che il seguente sia un piano generale migliore: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(perdonami se questo editore
distrutto

Dov'è WHERE?? O WHEREnon è possibile?
Green

42

Un modo alternativo per ottenere lo stesso risultato è di non usare la JOINparola chiave.

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col

3
Ho provato questo su 5.5.62 e mysql non mi è piaciuta la sintassi. Secondo il manuale [ dev.mysql.com/doc/refman/5.6/en/update.html] , la query dovrebbe essere: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
Questo è implicito JOINnello stesso modo in cui lo SELECT * FROM TABLE_A, TABLE_B ...fa
Madbreaks,

Ciò significa che in 5.5 solo i moduli di join impliciti sono accettati per l'aggiornamento?
userfuser

@userfuser No, il manuale indica la sintassi: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]In seguito, il manuale afferma: "La table_referencesclausola elenca le tabelle coinvolte nel join. La sua sintassi è descritta nella Sezione 13.2.9.2, Sintassi JOIN ."
hmundt

4
Non è lo stesso risultato esatto: è possibile eseguire join a sinistra con la sintassi del join.
Gerard ONeill,

10

Di seguito è la query di aggiornamento che include JOINe WHEREentrambi. Allo stesso modo possiamo usare la clausola multiple join / where, spero che ti possa aiutare: -

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')

3
Benvenuto in Stack Overflow! Grazie per questo frammento di codice, che può fornire un aiuto immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore educativo mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con domande simili, ma non identiche. Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

2

Un piano generale alternativo, che sto solo aggiungendo come risposta indipendente perché il "commento su una risposta" sparato non prenderà nuove righe senza pubblicare l'intera modifica, anche se non è ancora finito.

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}

Esempio:

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;

1

Per esempio 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; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.