Рубрики
SQL

Обновление нескольких связанных таблиц SQL

Порядок обновления такой

  • Мы вводим команду UPDATE
  • После команды UPDATE мы делаем объединение таблиц
  • После этого мы пишем команду SET и пишем какие столбцы мы хотим обновить. 

Получается, что после UPDATE будет объединенная таблица.  

А строки объединенной таблицы будут условием обновления объединенных таблиц.

Т.е. в обновляемых таблицах обновятся только те строки, которые есть в объединенной таблице. 

Мы получаем внутри UPDATE используя INNER JOIN и ON выборку данных, состоящую из строк.

Те столбцы, которые обновляются в SET обновятся не для всей таблицы, а только для тех строк, которые попали в выборку. 

Другими словами, в исходных таблицах будут обновлены только те строки, которые удовлетворяют условиям объединения.  Обновятся только те строки исходных таблиц, ключевые поля которых попадают в объединенную таблицу.

Те строки, исходных таблиц, которые не попали в объединенную таблицу, не будут обновлены.

После оператора UPDATE мы как бы говорим обновить это. А после оператора SET пишем, что именно мы обновляем.

Задание

Задача взята из курса «Интерактивный тренажер по SQL«, ссылка на модуль с задачей. На мой взгляд это один из лучших технических курсов. В нём минимум теории, много примеров и задач.

Для книг, которые уже есть на складе (в таблице book), но по другой цене, чем в поставке (supply), необходимо в таблице book увеличить количество на значение, указанное в поставке, и пересчитать цену. А в таблице supply обнулить количество этих книг. Формула для пересчета цены:

формула

где  p1, p2 — цена книги в таблицах book и supply;

       k1, k2 — количество книг в таблицах book и supply.

Запрос

UPDATE book 
     INNER JOIN author ON author.author_id = book.author_id
     INNER JOIN supply ON book.title = supply.title 
                         and supply.author = author.name_author and book.price <> supply.price
SET 
book.amount = book.amount + supply.amount,
book.price = (book.price * book.amount + supply.price * supply.amount) / (book.amount + supply.amount),
supply.amount = 0

Результат:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *