Як зробити 3 таблиці ПРИЄДНАЙТЕСЬ у запиті 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

Зараз я хочу зробити це, якщо є три таблиці, що займаються чимось подібним.

    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

Відповіді:


809

відповідь 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 повідомляє про нульові рядки, хоча дані показують, що оновлення були зроблені.
Піаноман

1
@Pianoman Зі мною це сталося так само, і це було пов'язане з ПОНОВНЕЮ CURRENT_TIMESTAMP, я тільки що додав оновлення вручну, і це виправили, просто сказавши, чи трапиться це комусь іншому
eric.itzhak

Якщо вам потрібна наочна допомога для правильного приєднання: перегляньте
tutorials.com/

Я думаю, що наступним є кращий Генеральний план: 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.52, і mysql не сподобався синтаксис. Відповідно до посібника [ dev.mysql.com/doc/refman/5.6/uk/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 Syntax ".
hmundt

4
Не точно такий же результат - ви можете робити ліві з'єднання з синтаксисом приєднання.
Джерард ONeill

10

Нижче наведено запит на оновлення, який включає 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
Ласкаво просимо до переповнення стека! Дякуємо за цей фрагмент коду, який може надати негайну допомогу. Правильне пояснення значно покращило б її навчальну цінність, показавши, чому це хороше рішення проблеми, і зробило б її кориснішою для майбутніх читачів із подібними, але не однаковими питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Toby Speight

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.