Если вы ищете, как это оценивается, рекурсия происходит в две фазы.
- Корень выполняется один раз.
- Рекурсивная часть выполняется до тех пор, пока не будут возвращены никакие строки. В этой связи документация немного расплывчата.
Теперь, как правило, в базах данных мы думаем о «функции» по-другому, чем мы думаем о них, когда мы требуем программирования. В терминах базы данных лучшим способом думать о функции является «соответствие, где для каждого значения домена у вас есть ровно одно соответствующее значение». Поэтому одной из ближайших задач является прекращение мышления с точки зрения функций программирования. Даже пользовательские функции лучше всего обдумать другим способом, так как это позволяет избежать большой потенциальной гадости в отношении пересечения работы с запросом и планировщиком запросов ... Таким образом, это может выглядеть как функция, но это неверно.
Вместо предложения WITH используется другая, почти обратная нотация. Здесь у вас есть заданное имя t
, затем (необязательно в этом случае) структурой кортежа (n)
. Таким образом, это не функция с параметром, а отношение со структурой.
Так как это ломается:
SELECT 1 as n where n < 100
UNION ALL
SELECT n + 1 FROM (SELECT 1 as n) where n < 100
UNION ALL
SELECT n + 1 FROM (SELECT n + 1 FROM (SELECT 1 as n)) where n < 100
Конечно, это упрощение, потому что внутренне мы отслеживаем КТР государства и сохранить присоединение к последней итерации, поэтому на практике они получают откинуть назад вблизи линейной сложность (в то время как приведенная выше диаграмма показала бы гораздо худшую производительность, чем эта).
Так что в реальности вы получите что-то подобное:
SELECT 1 as n where 1 < 100
UNION ALL
SELECT 1 + 1 as n where 1 + 1 < 100
UNION ALL
SELECT 2 + 1 AS n WHERE 2 + 1 < 100
...
В сущности предыдущие значения переносятся.
http://stackoverflow.com/q/30015842/330315 –