Jak wykonać JOIN z 3 tabelami w zapytaniu UPDATE?

466

Zadałem pytanie i otrzymałem odpowiedź, która pomogła.

   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

Teraz chcę to zrobić, jeśli w grę wchodzą 3 stoły.

    UPDATE tableC c JOIN tableB b JOIN tableA a

moje pytanie jest w gruncie rzeczy ... czy jest to możliwe, aby wykonać 3 łączenie tabeli na UPDATEwyciągu? i jaka jest jego poprawna składnia? Dziękuję Ci. Czy robię ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA
Ricky
źródło
2
Jasne, że to możliwe. Spróbuj. Składnia jest taka, jaką masz - wystarczy dodać następny JOINi jego ONwarunek, tak jak w SELECTzapytaniu.
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
Wspomniane pytanie znajduje się tutaj: stackoverflow.com/questions/15206746/…
Urs

Odpowiedzi:

809

odpowiedź brzmi: yesmożesz

spróbuj tego w ten sposób

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

EDYTOWAĆ:

Aby dołączyć do ogólnej aktualizacji:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]
echo_Me
źródło
2
Dziwne jest jednak to, że moje oprogramowanie HeidiSQL zgłasza zerowe wiersze, chociaż dane pokazują, że aktualizacje zostały wykonane.
Pianoman
1
@Pianoman Dla mnie to też się wydarzyło i miało to coś wspólnego z AKTUALIZACJĄ AKTUALIZACJI CZASU, właśnie dodałem ręcznie aktualizację i naprawiłem ją, mówiąc tylko, czy zdarzy się to komuś innemu
eric.itzhak
Jeśli potrzebujesz pomocy wizualnej, aby uzyskać prawidłowe połączenia, przeglądaj: tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd
Myślę, że lepszy jest plan ogólny: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(wybacz mi, jeśli ten przeklęty redaktor nie pozwoli mi wchodzić na nowe linie bez robienia pełnego postu)
UncaAlby
Gdzie jest WHERE?? Czy WHEREnie jest to możliwe?
Green
42

Alternatywnym sposobem osiągnięcia tego samego wyniku jest w ogóle nie używanie JOINsłowa kluczowego.

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
źródło
3
Próbowałem tego na 5.5.62 i mysql nie podobała się składnia. Zgodnie z instrukcją [ dev.mysql.com/doc/refman/5.6/en/update.html] zapytanie powinno wyglądać następująco: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
Robi to domyślnie JOINw ten sam sposób, co SELECT * FROM TABLE_A, TABLE_B ...robi
Madbreaks
Czy to oznacza, że ​​w wersji 5.5 tylko aktualizacja niejawnego łączenia jest akceptowana do aktualizacji?
userfuser
@ użytkownikserser Nie, nie ma, instrukcja podaje składnię: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Później instrukcja stwierdza: „ table_referencesKlauzula zawiera listę tabel uczestniczących w złączeniu. Jej składnia jest opisana w rozdziale 13.2.9.2, Składnia JOIN .”
hmundt
4
Niezupełnie ten sam wynik - możesz wykonywać lewe złączenia za pomocą składni złączenia.
Gerard ONeill
10

Poniżej znajduje się zapytanie o aktualizację, które obejmuje JOIN& WHEREoba. W ten sam sposób możemy użyć wielu klauzul Join / Where, Mam nadzieję, że to pomoże:

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
źródło
3
Witamy w Stack Overflow! Dziękujemy za ten fragment kodu, który może zapewnić natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego wartość edukacyjną, pokazując, dlaczego jest to dobre rozwiązanie problemu, i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z podobnymi, ale nie identycznymi pytaniami. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight,
2

Alternatywny plan ogólny, który dodaję tylko jako niezależną odpowiedź, ponieważ przeklęty „komentarz do odpowiedzi” nie przyjmuje nowych wierszy bez opublikowania całej edycji, nawet jeśli nie jest jeszcze ukończony.

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}

Przykład:

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
źródło
1

Na przykład 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
źródło