Рекурсивный запрос — это мощная функция, которая позволяет запрашивать иерархические данные, используемые в реляционных базах данных. Это составная операция, которая помогает накапливать записи каждый раз, пока повторение не изменит результат.
Рекурсивные запросы полезны для построения дерева иерархии, они лучше всего подходят для работы с иерархическими данными, такими как организационные диаграммы для графиков обхода списка материалов или для создания произвольных наборов строк. Это включает в себя соединение набора с самим собой произвольное количество раз. Рекурсивный запрос обычно определяется якорной частью и рекурсивной частью.
Рекурсивные соединения иногда также называют «соединениями с фиксированной точкой». Они используются для получения данных родитель-потомок. В SQL рекурсивные соединения реализуются с помощью рекурсивных общих табличных выражений. Рекурсивное общее табличное выражение (CTE) — это способ многократного обращения к запросу.
Теперь мы понимаем рекурсивное соединение в SQL на примере.
Шаг 1: Сначала мы создаем базу данных сотрудников, где общее табличное выражение компании для ее идентификатора сотрудника, имени сотрудника, возраста сотрудника.
Запрос:
CREATE TABLE employees ( id serial, name varchar(20), age int );
Шаг 2: На этом шаге вставьте значения в таблицу сотрудников.
Запрос:
INSERT INTO employees VALUES (1, 'Ankit', 32); INSERT INTO employees VALUES (2, 'Ayush', 31); INSERT INTO employees VALUES (3, 'Piyush', 42); INSERT INTO employees VALUES (4, 'Ramesh', 31); INSERT INTO employees VALUES (5, 'Rohan', 29); INSERT INTO employees VALUES (6, 'Harry', 28); INSERT INTO employees VALUES (7, 'Rohit', 32); INSERT INTO employees VALUES (8, 'Gogi', 32); INSERT INTO employees VALUES (9, 'Tapu', 33); INSERT INTO employees VALUES (10, 'Sonu', 40);
Шаг 3: Заявление, в котором представлены все отчеты, относящиеся к определенной организации внутри компании. CTE определяется с помощью оператора WITH, за которым следует определение табличного выражения. Команда AS используется для переименования столбца или таблицы с помощью псевдонима. Рекурсивное CTE должно содержать оператор UNION и быть рекурсивным.
Запрос:
WITH RECURSIVE managertree AS ( SELECT id, name, age FROM employees WHERE id = 1 UNION ALL SELECT e.id, e.name, e.age FROM employees e INNER JOIN managertree mtree ON mtree.id = e.age )
Шаг 4: Чтобы проверить данные рекурсивного соединения, мы используем следующий запрос.
Запрос:
SELECT * FROM managertree;
Выход: