Учебное пособие Санкт-Петербург «бхв-петербург»


WITH RECURSIVE ranges ( min_sum, max_sum )



Pdf көрінісі
бет157/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   153   154   155   156   157   158   159   160   ...   256
sql osnovi yazika

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 строк)
201


Глава 6. Запросы
Здесь мы с помощью предложения VALUES специально создали виртуальную
таблицу из трех строк, хотя для получения требуемого результата достаточно
только одной строки (0, 100000). Еще важно то, что предложение UNION ALL не
удаляет строки-дубликаты, поэтому мы можем видеть весь рекурсивный про-
цесс порождения новых строк.
При рекурсивном выполнении запроса
SELECT min_sum + 100000, max_sum + 100000
FROM ranges
WHERE max_sum < ( SELECT max( total_amount ) FROM bookings )
каждый раз выполняется проверка в условии WHERE. И на (− 2)-й итерации это
условие отсеивает одну строку, т. к. после (− 3)-й итерации значение атрибута
max_sum в третьей строке было равно 1 300 000.
Ведь запрос


Достарыңызбен бөлісу:
1   ...   153   154   155   156   157   158   159   160   ...   256




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

    Басты бет