Почему в рекурсивном SQL «диапазоне» запросов нет дубликатов? - PullRequest
1 голос
/ 13 марта 2020

Для справки, вот оно:

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 заканчивается как:

  • 1

Итерация 2

range_10 заканчивается как:

  • 1
  • 2

Итерация 3

range_10 заканчивается как:

  • 1
  • 2
  • 2
  • 3

Почему? Поскольку мы SELECT 'ed n + 1 для всех строк таблицы (их было две), мы выполнили UNION ALL, который не удаляет дубликаты. Чтобы сделать это более понятным:

Итерация 4

  • 1
  • 2
  • 2
  • 3
  • 2
  • 3
  • 3
  • 4

Действительно ли UNION ALL означает UNION в контексте рекурсивных запросов? Или я упускаю что-то более фундаментальное в рекурсивных запросах?

1 Ответ

2 голосов
/ 13 марта 2020

Как обсуждено здесь входные данные для каждого рекурсивного выполнения - это просто результат предыдущего уровня, а не совокупный результат.

Уровень привязки генерирует 1. Выполнение рекурсивной части на котором выдает 2. Выполнение рекурсивной части на 2 выдает 3 и т. д.

...