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



Pdf көрінісі
бет147/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   143   144   145   146   147   148   149   150   ...   256
sql osnovi yazika

( 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;
В этом примере мы явно указали имена столбцов для временной таблицы 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 )
187


Глава 6. Запросы
Важную роль в этом процессе играет предложение UNION ALL, благодаря которо-
му происходит объединение сформированных строк в единую таблицу. Поскольку
в нашем примере в рекурсивном алгоритме участвует только одна строка, то строк-
дубликатов не возникает, поэтому мы используем не UNION, а UNION ALL. При ис-
пользовании предложения UNION выполняется устранение строк-дубликатов, но в
данном случае необходимости в выполнении этой операции нет, следовательно, це-
лесообразно использовать именно UNION ALL.
Получим такую таблицу:
min_sum | max_sum
---------+--------
0 | 100000
100000 | 200000
200000 | 300000
...
1000000 | 1100000
1100000 | 1200000
1200000 | 1300000
(13 строк)
Здесь в предложении WHERE используется скалярный подзапрос. С результатом его
выполнения сравнивается значение столбца max_sum:


Достарыңызбен бөлісу:
1   ...   143   144   145   146   147   148   149   150   ...   256




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

    Басты бет