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


WITH RECURSIVE ranges ( min_sum, max_sum ) AS



Pdf көрінісі
бет152/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   148   149   150   151   152   153   154   155   ...   243
Байланысты:
Язык SQL. Базовый курс

WITH RECURSIVE ranges ( min_sum, max_sum ) AS
( VALUES( 0,
100000 ),
( 100000, 200000 ),
( 200000, 300000 )
UNION ALL
SELECT min_sum + 100000, max_sum + 100000
FROM ranges
WHERE max_sum <
( SELECT max( total_amount ) FROM bookings )
)
SELECT * FROM ranges;
min_sum | max_sum
---------+---------
0 | 100000
исходные строки
100000 | 200000
200000 | 300000
100000 | 200000
результат первой итерации
200000 | 300000
300000 | 400000
200000 | 300000
результат второй итерации
300000 | 400000
400000 | 500000
300000 | 400000
400000 | 500000
500000 | 600000
...
1000000 | 1100000
результат (n-3)-й итерации
1100000 | 1200000
1200000 | 1300000
1100000 | 1200000
результат (n-2)-й итерации
1200000 | 1300000
1200000 | 1300000
результат (n-1)-й итерации (предпоследней)
(36 строк)
Здесь мы с помощью предложения VALUES специально создали виртуальную
таблицу из трех строк, хотя для получения требуемого результата достаточно
156


только одной строки (0, 100000). Еще важно то, что предложение UNION ALL не
удаляет строки-дубликаты, поэтому мы можем видеть весь рекурсивный про-
цесс порождения новых строк.
При рекурсивном выполнении запроса
SELECT min_sum + 100000, max_sum + 100000 ...
каждый раз выполняется проверка в условии WHERE. И на (
n

2
)-й итерации это
условие отсеивает одну строку, т. к. после (
n

3
)-й итерации значение атрибута
max_sum в третьей строке было равно 1 300 000. Ведь запрос
SELECT max( total_amount ) FROM bookings;
выдаст значение
max
------------
1204500.00
(1 строка)
Таким образом, после (
n

2
)-й итерации во временной области остается всего
две строки, после (
n

1
)-й итерации во временной области остается только од-
на строка. Заключительная итерация уже не добавляет строк в результирующую
таблицу, поскольку единственная строка, поданная на вход команде SELECT, бу-
дет отклонена условием WHERE. Работа алгоритма завершается.
Задание 1.
Модифицируйте запрос, добавив в него столбец level (можно назвать
его и iteration). Этот столбец должен содержать номер текущей итерации, поэто-
му нужно увеличивать его значение на единицу на каждом шаге. Не забудьте
задать начальное значение для добавленного столбца в предложении VALUES.
Задание 2.
Для завершения экспериментов замените UNION ALL на UNION и
выполните запрос. Сравните этот результат с предыдущим, когда мы использо-
вали UNION ALL.
20.* В тексте главы есть такой запрос, вычисляющий распределение сумм брониро-
ваний по диапазонам в сто тысяч рублей:


Достарыңызбен бөлісу:
1   ...   148   149   150   151   152   153   154   155   ...   243




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

    Басты бет