Для справки, вот оно:
WITH range_10 AS (
SELECT 1 AS n
UNION ALL
SELECT n+1 AS n
FROM range_10
WHERE n < 10
)
SELECT * FROM range_10;
Как мы все знаем и любим, это генерирует один столбец n
со значениями от одного до десяти. Однако меня смущает, почему в выводе нет повторяющихся значений n
. Вот мое понимание того, как выполняется этот запрос:
Итерация 1
range_10 начинается пусто
range_10 заканчивается как:
Итерация 2
range_10 заканчивается как:
Итерация 3
range_10 заканчивается как:
Почему? Поскольку мы SELECT
'ed n + 1 для всех строк таблицы (их было две), мы выполнили UNION ALL
, который не удаляет дубликаты. Чтобы сделать это более понятным:
Итерация 4
Действительно ли UNION ALL
означает UNION
в контексте рекурсивных запросов? Или я упускаю что-то более фундаментальное в рекурсивных запросах?