Как сделать рекурсию с ‘for’ posgres?

В PostgreSQL нет прямой поддержки рекурсии с использованием конструкции "for". Однако, вы можете использовать рекурсивные запросы (common table expressions, CTE), чтобы эмулировать рекурсию в PostgreSQL.

Для создания рекурсивного запроса с использованием CTE в PostgreSQL, вы должны определить рекурсивную часть запроса и определить условие остановки, чтобы избежать бесконечной рекурсии.

Прежде всего, нам понадобится таблица, на которой будем выполнять рекурсивный запрос. Давайте создадим таблицу "employees" с полями "id" и "manager_id":

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT
);

Теперь, предположим, что нам нужно получить всех подчиненных для заданного сотрудника. Мы можем использовать рекурсивный запрос, чтобы найти всех подчиненных:

WITH RECURSIVE subordinates AS (
    SELECT id, name, manager_id
    FROM employees
    WHERE id = {заданный id}
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN subordinates s ON e.manager_id = s.id
)
SELECT *
FROM subordinates;

Обратите внимание на ключевое слово "RECURSIVE", которое указывает, что это рекурсивный CTE.

В рекурсивной части CTE мы выбираем записи из таблицы "employees", где "id" равно заданному идентификатору. Затем мы используем оператор "UNION ALL", чтобы объединить результаты выборки с предыдущими рекурсивными записями.

Затем мы соединяем таблицу "employees" с CTE "subordinates" по полю "manager_id", чтобы получить всех подчиненных для каждого рекурсивного уровня.

В итоговом запросе, мы выбираем все записи из CTE "subordinates", чтобы получить их.

Важно создать правильное условие остановки в рекурсии, чтобы избежать бесконечной рекурсии. В данном случае, мы останавливаемся, когда не остается подчиненных для заданного сотрудника.

Использование рекурсивных запросов может быть очень полезным для выполнения сложных операций с данными в PostgreSQL. Однако, необходимо быть осторожным, чтобы избежать возможности бесконечной рекурсии и выполнения медленных запросов.