Обновление полей косвенно связанными данными - PullRequest
0 голосов
/ 01 октября 2018

У меня есть четыре стола:

  • стол ученика с id_student, firstname и lastname полями
  • стол проката с id_student и id_book
  • стол бронирования с id_book, book_name, author_name
  • стол бронирования с id_book, current_student

В арендной таблице есть только идентификаторы исвязи между таблицами учеников и книг.

Как я могу обновить поле booking.current_student с помощью конкатенации полей firstname и lastname из таблицы учеников (например, 'john doe') - для каждого id_bookв таблице бронирования обновите booking.curent_student из student.firstname и student.lastname.

Поскольку в таблице бронирования нет столбца id_student, как мне обновить booking.current_student из таблицы ученика?

1 Ответ

0 голосов
/ 01 октября 2018

Вам необходимо коррелированное обновление, которое использует подзапрос, чтобы получить новое значение для использования в предложении 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...