Вам необходимо коррелированное обновление, которое использует подзапрос, чтобы получить новое значение для использования в предложении set
для каждой строки;и этот подзапрос должен объединить таблицы ренты и ученика:
update booking b
set current_student = (
select s.firstname || ' ' || s.lastname
from rent r
join student s on s.id_student = r.id_student
where r.id_book = b.id_book
);
Часть 'корреляции' состоит в том, что подзапрос фильтрует r.id_book = b.id_book
, поэтому он коррелирует с внешним booking
(b
)Таблица, которая обновляется.
Если в booking
есть какие-либо строки, у которых нет соответствующей строки rent
, тогда они будут установлены в нуль.И если у вас есть несколько booking
строк для одного и того же book
ID, то все они будут обновлены до одного и того же имени студента;и если у вас есть несколько rent
строк для одного и того же идентификатора книги, это приведет к ошибке, поскольку подзапрос вернет несколько строк.
Как правило, дублировать данные подобным образом не очень хорошая идея.Это потребовало бы меньшего количества обслуживания, если бы вы вместо этого использовали представление:
create view booking (id_book, current_name) as
select r.id_book, s.firstname || ' ' || s.lastname
from rent r
join student s on s.id_student = r.id_student;
Затем, когда строки добавляются или удаляются из таблицы арендной платы, или если студент меняет свое имя, представление автоматически отражает изменения безвам нужно что-то делать.