Menu
Coddy logo textTech

Последовательность чисел

Часть раздела Продвинутый уровень путешествия по SQL на Coddy — урок 20 из 27.

Вы познакомились с ключевым словом WITH в Основах для именования подзапроса, также известного как CTE (обобщенное табличное выражение). Рекурсивное CTE идет на шаг дальше: оно позволяет подзапросу ссылаться на самого себя, формируя результат строка за строкой.

Самая простая версия генерирует последовательность чисел без использования базовой таблицы. Структура всегда одинакова:

WITH RECURSIVE counter(n) AS (
    SELECT 1                              -- якорь: начальная строка
    UNION ALL
    SELECT n + 1 FROM counter WHERE n < 5 -- рекурсивная часть: создание следующей строки на основе предыдущей
)
SELECT n FROM counter

Читайте это так: начните с n = 1, затем продолжайте добавлять строки, где каждое n равно предыдущему n + 1, останавливаясь, когда WHERE перестает соответствовать. Результатом будет 1, 2, 3, 4, 5.

Две части тела объединяются оператором UNION ALL. Первая — это якорь: начальные строки. Вторая — это рекурсивный шаг: он обращается к самому CTE.

challenge icon

Задание

Легко

Напишите рекурсивное CTE с именем powers с двумя столбцами:

  • i: индекс итерации, начинающийся с 1
  • p: 2 в степени i (2, 4, 8, …)

Остановитесь, как только p превысит 1000. Верните оба столбца, отсортированные по i в порядке возрастания.

Шпаргалка

Рекурсивное CTE позволяет подзапросу ссылаться на самого себя, формируя результаты строка за строкой:

WITH RECURSIVE counter(n) AS (
    SELECT 1                               -- anchor: начальная строка
    UNION ALL
    SELECT n + 1 FROM counter WHERE n < 5  -- recursive step: рекурсивный шаг
)
SELECT n FROM counter
  • Anchor (Якорь): начальная строка или строки (первый SELECT)
  • Рекурсивный шаг: запрашивает само CTE для создания следующей строки
  • Останавливается, когда условие WHERE перестает выполняться
  • Две части объединяются с помощью UNION ALL

Попробуйте сами

WITH RECURSIVE powers(i, p) AS (
    -- якорь: i=1, p=2
    -- рекурсия: i+1, p*2, пока p не достигнет 1000
)
SELECT i, p FROM powers ORDER BY i
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Продвинутый уровень