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


рекурсивного общего табличного выражения



Pdf көрінісі
бет142/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   138   139   140   141   142   143   144   145   ...   243
Байланысты:
Язык SQL. Базовый курс

рекурсивного общего табличного выражения
:
WITH RECURSIVE ranges ( min_sum, max_sum ) AS
( VALUES ( 0, 100000 )
UNION ALL
SELECT min_sum + 100000, max_sum + 100000
FROM ranges
WHERE max_sum <
( SELECT max( total_amount ) FROM bookings )
)
SELECT * FROM ranges;
144


В этом примере мы явно указали имена столбцов для временной таблицы ranges —
это min_sum и max_sum. Рекурсивный алгоритм работает следующим образом:
– сначала выполняется предложение VALUES (0, 100000) и результат записывается во
временную область памяти;
– затем к этой временной области памяти применяется запрос
SELECT min_sum + 100000, max_sum + 100000
...
в результате его выполнения формируется только одна строка, поскольку в исход-
ном предложении VALUES была сформирована только одна строка и только одна
строка была помещена во временную область памяти;
– вновь сформированная строка вместе с исходной строкой помещаются в другую
временную область, в которой происходит накапливание результирующих строк;
– к той строке, которая была на предыдущем шаге сформирована с помощью коман-
ды SELECT, опять применяется эта же команда и т. д.;
– работа завершится, когда перестанет выполняться условие
max_sum < ( SELECT max( total_amount ) FROM bookings )
Важную роль в этом процессе играет предложение UNION ALL, благодаря которо-
му происходит объединение сформированных строк в единую таблицу. Поскольку в
нашем примере в рекурсивном алгоритме участвует только одна строка, то строк-
дубликатов не возникает, поэтому мы используем не UNION, а UNION ALL. При ис-
пользовании предложения UNION выполняется устранение строк-дубликатов, но в
данном случае необходимости в выполнении этой операции нет, следовательно, це-
лесообразно использовать именно UNION ALL.
Получим такую таблицу:
min_sum | max_sum
---------+--------
0 | 100000
100000 | 200000
200000 | 300000
300000 | 400000
400000 | 500000
500000 | 600000
600000 | 700000
700000 | 800000
800000 | 900000
900000 | 1000000
1000000 | 1100000
1100000 | 1200000
1200000 | 1300000
(13 строк)
Здесь в предложении WHERE используется скалярный подзапрос. С результатом его
выполнения сравнивается значение столбца max_sum:


Достарыңызбен бөлісу:
1   ...   138   139   140   141   142   143   144   145   ...   243




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

    Басты бет