В этом примере мы явно указали имена столбцов для временной таблицы 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:
Достарыңызбен бөлісу: