Глава 7. Изменение данных
Этот запрос работает следующим образом. Добавление новой записи о бронирова-
нии авиаперелета производится в общем табличном выражении, а наращивание со-
ответствующего счетчика — в главном запросе. Поскольку в общем табличном вы-
ражении присутствует предложение RETURNING *, значения атрибутов добавлен-
ной строки будут доступны в главном запросе посредством обращения к временной
таблице sell_ticket. Конечно, если строка фактически не будет добавлена из-за
дублирования значения первичного ключа, тогда будет сгенерировано сообщение
об ошибке, в результате главный запрос выполнен не будет, следовательно, таблица
tickets_directions не будет обновлена.
В главном запросе мы обновляем всего два атрибута, причем значение атрибута
tickets_num может увеличиться только на единицу, поскольку мы добавляем од-
ну строку в таблицу ticket_flights_tmp. Остается выяснить, каким образом мож-
но определить ту строку в таблице tickets_directions, атрибуты которой нужно
обновить. Нам требуется на основе значения идентификатора рейса flight_id, на
который был забронирован билет (перелет), определить города отправления и при-
бытия, которые как раз и идентифицируют строку в таблице tickets_directions.
Эти три атрибута присутствуют в представлении flights_v. Подзапрос обращается
к этому представлению, а вложенный подзапрос возвращает значение идентифика-
тора рейса flight_id, на который был забронирован билет (перелет). Назначение
вложенного подзапроса в том, чтобы в условии WHERE flight_id = ... не дубли-
ровать значение атрибута flight_id, использованное в команде INSERT (в данном
примере это 30829). Тем самым должен быть снижен риск ошибки при вводе данных.
Обратите внимание, что подзапрос в предложении WHERE возвращает два столбца, и
сравнение выполняется также сразу с двумя столбцами.
Посмотрим, что получилось:
Достарыңызбен бөлісу: