Учебно-практическое пособие москва 2017 ббк



Pdf көрінісі
бет176/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   172   173   174   175   176   177   178   179   ...   243
Байланысты:
Язык SQL. Базовый курс

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 для обновления.
180


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


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




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

    Басты бет