только одной строки (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.* В тексте главы есть такой запрос, вычисляющий распределение сумм брониро-
ваний по диапазонам в сто тысяч рублей:
Достарыңызбен бөлісу: