MySql Обновление объединенной таблицы - PullRequest
35 голосов
/ 30 ноября 2011

Я хочу обновить таблицу в операторе, в котором есть несколько объединений.Хотя я знаю, что порядок соединений не имеет большого значения (если только вы не используете подсказки оптимизатора), я приказал им определенным образом быть наиболее интуитивно понятным для чтения.Однако это приводит к тому, что таблица, которую я хочу обновить, не является той, с которой я начинаю, и у меня возникают проблемы при ее обновлении.

Фиктивный пример того, что я хотел бы сделать, выглядит примерно так:

UPDATE b
FROM tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

Здесь много сообщений об обновлении с помощью объединений, однако у них всегда сначала обновляется таблица.Я знаю, что это возможно в SQL Server и, надеюсь, возможно в MySQL!

Ответы [ 3 ]

88 голосов
/ 30 ноября 2011

Синтаксис UPDATE для нескольких таблиц в MySQL отличается от Microsoft SQL Server. Вам не нужно указывать, какие таблицы вы обновляете, это подразумевается в предложении SET.

UPDATE tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

В синтаксисе MySQL отсутствует предложение FROM.

ОБНОВЛЕНИЕ с JOIN не является стандартным SQL, и MySQL и Microsoft SQL Server реализовали свои собственные идеи как расширение стандартного синтаксиса.

3 голосов
/ 30 ноября 2011

Вы неверно упорядочили утверждения. Вы можете прочитать о синтаксисе здесь (я знаю, это довольно сложно читать.

UPDATE tableA a
  JOIN tableB b
    ON a.a_id = b.a_id
  JOIN tableC c
    ON b.b_id = c.b_id
   SET b.val = a.val+c.val
 WHERE a.val > 10
   AND c.val > 10;

sql скрипка

0 голосов
/ 30 ноября 2011

Эта ссылка должна дать вам синтаксис, необходимый MySQL, и здесь является примером.Зачем вам нужно объединить две таблицы?это ограничить обновления записей?Я спрашиваю, потому что вы также можете сделать что-то вроде следующего:

update B set B.x=<value>
    where 
B.<value> is in(
    select A.y 
      from A left outer join B on A.<value>=B.<value>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...