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



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

WITH aicrafts_seats AS
( SELECT aircraft_code, model, seats_num,
rank() OVER (
PARTITION BY left( model, strpos( model, ' ' ) - 1 )
ORDER BY seats_num
)
FROM (
SELECT a.aircraft_code, a.model, count( * ) AS seats_num
FROM aircrafts_tmp a, seats s
WHERE a.aircraft_code = s.aircraft_code
GROUP BY 1, 2
) AS seats_numbers
)
DELETE FROM aircrafts_tmp a
USING aicrafts_seats a_s
WHERE a.aircraft_code = a_s.aircraft_code
AND left( a.model, strpos( a.model, ' ' ) - 1 )
IN ( 'Boeing', 'Airbus' )
AND a_s.rank = 1
RETURNING *;
Шаг 1 выполняется в подзапросе в предложении WITH. Шаг 2 выполняется в
главном запросе в предложении WITH. Шаг 3 реализуется командой DELETE.
Обратите внимание, что название компании-производителя мы определяем
путем взятия подстроки от значения атрибута model: от начала строки до про-
бельного символа (используем функции left и strpos).
Мы включили предложение RETURNING * для того, чтобы увидеть, какие имен-
но модели были удалены.
Предложение WITH выдает такой результат:
aircraft_code |
model
| seats_num | rank
---------------+---------------------+-----------+------
319
| Airbus A319-100
|
116 |
1
320
| Airbus A320-200
|
140 |
2
182


321
| Airbus A321-200
|
170 |
3
733
| Boeing 737-300
|
130 |
1
763
| Boeing 767-300
|
222 |
2
773
| Boeing 777-300
|
402 |
3
CR2
| Bombardier CRJ-200 |
50 |
1
CN1
| Cessna 208 Caravan |
12 |
1
SU9
| Sukhoi SuperJet-100 |
97 |
1
(9 строк)
Очевидно, что должны быть удалены модели с кодами 319 и 733.
После выполнения запроса получим такое сообщение (это работает предложе-
ние RETURNING *):
--[ RECORD 1 ]-+----------------
aircraft_code | 319
model
| Airbus A319-100
range
| 6700
aircraft_code | 319
model
| Airbus A319-100
seats_num
| 116
rank
| 1
--[ RECORD 2 ]-+----------------
aircraft_code | 733
model
| Boeing 737-300
range
| 4200
aircraft_code | 733
model
| Boeing 737-300
seats_num
| 130
rank
| 1
DELETE 2
Обратите внимание, что были выведены комбинированные строки, получен-
ные при соединении таблицы aircrafts_tmp с временной таблицей aicrafts_seats,
указанной в предложении USING. Но удалены были, конечно, строки из таблицы
aircrafts_tmp.
Задание: предложите другой вариант решения этой задачи. Например, можно
поступить так: оставить предложение WITH без изменений, из команды DELETE
убрать предложение USING, а в предложении WHERE вместо соединения таблиц
использовать подзапрос с предикатом IN для получения списка кодов удаляе-
мых моделей самолетов.
Еще один вариант решения задачи связан с использованием представлений, ко-
торые мы рассматривали в главе 5. В данном случае можно создать представле-
ние на основе таблиц «Самолеты» (aircrafts) и «Места» (seats) и перенести кон-
струкцию с функциями left и strpos в представление. В нем будут вычисляемые
столбцы: company — «Компания — производитель самолетов» и seats_num —
«Число мест».


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




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

    Басты бет