Как сделать 3 таблицы JOIN в запросе UPDATE?


466

Я задал вопрос и получил этот ответ, который помог.

   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

Теперь я собираюсь сделать это, если в этом участвуют 3 таблицы.

    UPDATE tableC c JOIN tableB b JOIN tableA a

мой вопрос в основном ... это возможно сделать 3 таблицы соединения в UPDATEзаявлении? и каков правильный синтаксис для этого? Спасибо. Я делаю ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
Конечно, это возможно. Попробуйте. Синтаксис такой же, как у вас есть - вам просто нужно добавить следующее JOINи его ONусловие, как в SELECTзапросе.
Майкл Берковски

2
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'
Майкл Берковски

1
Упомянутый вопрос здесь: stackoverflow.com/questions/15206746/…
Urs

Ответы:


810

ответ yesвы можете

попробуй так

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

РЕДАКТИРОВАТЬ:

Для общего обновления присоединиться:

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

2
Странно, однако, что мое программное обеспечение HeidiSQL сообщает об отсутствии строк, на которые влияют, хотя данные показывают, что обновления были сделаны.
Pianoman

1
@Pianoman Для меня это тоже произошло, и это имело какое-то отношение к ON UPDATE CURRENT_TIMESTAMP, я просто добавил обновление вручную и исправил его, просто сказав, если это случится с кем-то еще
eric.itzhak

Если вам нужно наглядное пособие, чтобы получить правильные соединения: browse-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd

Я думаю, что следующий план лучше: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(простите, если этот проклятый редактор не позволит мне вводить новые строки без полной записи)
UncaAlby

Где находится WHERE?? Или WHEREэто невозможно?
Зеленый,

42

Альтернативный способ достижения того же результата - вообще не использовать JOINключевое слово.

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
Я попробовал это на 5.5.62, и MySQL не понравился синтаксис. Согласно руководству [ dev.mysql.com/doc/refman/5.6/en/update.html] , запрос должен быть: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
Это подразумевает JOINто же самое, что SELECT * FROM TABLE_A, TABLE_B ...делает
Madbreaks

Значит ли это, что в версии 5.5 для обновления принимается только неявная форма соединений?
userfuser

@userfuser Нет, это не так, в руководстве указывается синтаксис: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]далее в руководстве говорится: «В этом table_referencesразделе перечислены таблицы, участвующие в объединении. Его синтаксис описан в разделе 13.2.9.2, Синтаксис JOIN ».
Хмундт

4
Не совсем тот же результат - вы можете сделать левое соединение с синтаксисом соединения.
Джерард ONeill

10

Ниже приведен запрос на обновление, который включает JOIN& WHEREоба. Таким же образом мы можем использовать несколько выражений join / where, надеюсь, это поможет вам:

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
Добро пожаловать в переполнение стека! Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. Правильное объяснение значительно повысило бы его образовательную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Тоби Спейт

2

Альтернативный генеральный план, который я добавляю только как независимый ответ, потому что взорванный «комментарий к ответу» не будет переносить новые строки без публикации всего редактирования, даже если он еще не закончен.

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}

Пример:

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

Для примера 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; 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.