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 *;
232
Контрольные вопросы и задания
Шаг 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
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
233
|