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



Pdf көрінісі
бет181/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   177   178   179   180   181   182   183   184   ...   256
sql osnovi yazika

Глава 7. Изменение данных
WITH sell_tickets AS
( INSERT INTO ticket_flights_tmp
( ticket_no, flight_id, fare_conditions, amount )
VALUES ( '1234567890123', 13829, 'Economy', 10500 ),
( '1234567890123', 4728, 'Economy', 3400 ),
( '1234567890123', 30523, 'Economy', 3400 ),
( '1234567890123', 7757, 'Economy', 3400 ),
( '1234567890123', 30829, 'Economy', 12800 )
RETURNING *
)
UPDATE tickets_directions td
SET last_ticket_time = current_timestamp,
tickets_num = tickets_num +
( SELECT count( * )
FROM sell_tickets st, flights_v f
WHERE st.flight_id = f.flight_id
AND f.departure_city = td.departure_city
AND f.arrival_city = td.arrival_city
)
WHERE ( td.departure_city, td.arrival_city ) IN
( SELECT departure_city, arrival_city
FROM flights_v
WHERE flight_id IN ( SELECT flight_id FROM sell_tickets )
);
UPDATE 4
В этой версии запроса предусмотрен единовременный ввод нескольких строк
в таблицу ticket_flights_tmp, причем перелеты могут выполняться на раз-
личных рейсах. Поэтому необходимо преобразовать список идентификаторов
этих рейсов в множество пар «город отправления — город прибытия», посколь-
ку именно для таких пар и ведется подсчет числа забронированных перелетов.
Эта задача решается в предложении WHERE, где вложенный подзапрос форми-
рует список идентификаторов рейсов, а внешний подзапрос преобразует этот
список в множество пар «город отправления — город прибытия». Затем с помо-
щью предиката IN производится отбор строк таблицы tickets_directions
для обновления.
Теперь обратимся к предложению SET. Подзапрос с функцией count вычисляет
количество перелетов по каждому направлению. Это коррелированный подза-
прос: он выполняется для каждой строки, отобранной в предложении WHERE.
В нем используется соединение временной таблицы sell_tickets с представ-
лением flights_v. Это нужно для того, чтобы подсчитать все перелеты, соот-
230


Контрольные вопросы и задания
ветствующие паре атрибутов «город отправления — город прибытия», взятых
из текущей обновляемой строки таблицы tickets_directions. Этот подза-
прос позволяет учесть такой факт: рейсы могут иметь различные идентифика-
торы flight_id, но при этом соответствовать одному и тому же направлению,
а в таблице tickets_directions учитываются именно направления.
В случае попытки повторного бронирования одного и того же перелета для дан-
ного пассажира, т. е. ввода строки с дубликатом первичного ключа, такая строка
будет отвергнута, и будет сгенерировано сообщение об ошибке. В таком случае
и таблица tickets_directions не будет обновлена.
Давайте посмотрим, что изменилось в таблице tickets_directions.


Достарыңызбен бөлісу:
1   ...   177   178   179   180   181   182   183   184   ...   256




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

    Басты бет