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

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]

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

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

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;

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; 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.