Учебное пособие Санкт-Петербург «бхв-петербург»


CREATE TEMP TABLE ticket_flights_tmp AS



Pdf көрінісі
бет174/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   170   171   172   173   174   175   176   177   ...   256
sql osnovi yazika

CREATE TEMP TABLE ticket_flights_tmp AS
SELECT * FROM ticket_flights WITH NO DATA;
ALTER TABLE ticket_flights_tmp
ADD PRIMARY KEY ( ticket_no, flight_id );
Теперь представим команду, которая и будет добавлять новую запись о продаже би-
лета и увеличивать в таблице tickets_directions значение счетчика проданных
билетов.
WITH sell_ticket AS
( INSERT INTO ticket_flights_tmp
( ticket_no, flight_id, fare_conditions, amount )
VALUES ( '1234567890123', 30829, 'Economy', 12800 )
RETURNING *
)
UPDATE tickets_directions td
SET last_ticket_time = current_timestamp,
tickets_num = tickets_num + 1
WHERE ( td.departure_city, td.arrival_city ) =
( SELECT departure_city, arrival_city
FROM flights_v
WHERE flight_id = ( SELECT flight_id FROM sell_ticket )
);
UPDATE 1
221


Глава 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 возвращает два столбца, и
сравнение выполняется также сразу с двумя столбцами.
Посмотрим, что получилось:


Достарыңызбен бөлісу:
1   ...   170   171   172   173   174   175   176   177   ...   256




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет