Изучение SQL: рекурсивные запросы
Основой любого рекурсивного запроса является производная таблица. С ее помощью мы можем сделать запрос. который будет выполняться до тех пор, пока не выполниться условие.
Общий вид рекурсивного запроса
WITH <имя> (<список столбцов>)
AS (
SELECT -- анкорная часть
UNION ALL -- рекурсивная часть
SELECT FROM <имя>
WHERE <условие продолжения интерации>
)
Для того чтобы происходила рекурсия мы используем в рекурсивной части ссылку на самого себя.
Пример 1
У нас есть табличка, в которой лежат сотрудники, у каждого сотрудника есть руководитель, который указывается в колонку ParentId. Нам надо найти менеджера, в непрямом подчинении которого есть указанный нами человек.

Наполнение таблицы.
Код запроса:
;WITH OrgStructure AS
(
SELECT Id, ParentId, EmployeeType, EmployeeName
FROM Employees
WHERE EmployeeName = 'Jim' -- отправная точка, нам надо найти менеджера сотрудника Jim
UNION ALL
SELECT e.Id, e.ParentId, e.EmployeeType, e.EmployeeName
FROM Employees as e
JOIN OrgStructure as os
ON e.Id = os.ParentId
)
SELECT * FROM OrgStructure
WHERE EmployeeType = 'manager' -- указываем что мы ищем менеджера.
Пример 2
Найдем первые 10 чисел Фибоначчи:
;WITH FIBONACHI AS
(
SELECT
1 Iteration,
1 SecondValue,
2 CurrentValue
UNION ALL
SELECT
Iteration + 1,
SecondValue = CurrentValue,
CurrentValue = SecondValue + CurrentValue
FROM FIBONACHI
WHERE Iteration < 10
)
SELECT CurrentValue FROM FIBONACHI