Последовательность чисел
Часть раздела Продвинутый уровень путешествия по 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.
Задание
ЛегкоНапишите рекурсивное CTE с именем powers с двумя столбцами:
i: индекс итерации, начинающийся с1p: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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.