Составить рекурсивный запрос
Есть две таблицы сотрудники и связь сотрудников. Необходимо получить идентификаторы всех дочерних сотрудников, их статусы и их уровни вложенности относительно сотрудника по которому ищем, выполнив следующие условия:
- если id сотрудника нет не в parent_id ни в child_id возвращаем пустой ответ (пример, Employee 3);
- если id сотрудника соответствует child_id и дальше нет ветвлений, возвращаем идентификатор статус и уровень вложенности его же (пример, Employee 2);
- если id сотрудника соответствует parent_id и для child_id дальше нет ветвлений, возвращаем данные child_id (пример, по идентификатору Employee 1 должен вернуться идентификатор, статус и уровень вложенности Employee 2);
- если id сотрудника соответствует parent_id или child_id и дальше есть ветвления, возвращаем идентификаторы и статусы последних сотрудников, и уровень их вложенности (пример, для идентификатора Employee 4 должны вернутся идентификаторы Employee 6, Employee 9, Employee 10, их статусы и уровни вложенности).
CREATE TABLE public.employee (
id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
full_name VARCHAR(60) NOT NULL,
status SMALLINT NOT NULL,
CONSTRAINT employee_pkey PRIMARY KEY (id));
CREATE TABLE public.join_employee (
id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
parent_id BIGINT NOT NULL,
child_id BIGINT NOT NULL,
CONSTRAINT join_employee_pkey PRIMARY KEY (id));
ALTER TABLE public.join_employee ADD CONSTRAINT fk_parent_id FOREIGN KEY (parent_id) REFERENCES public.employee(id);
ALTER TABLE public.join_employee ADD CONSTRAINT fk_child_id FOREIGN KEY (child_id) REFERENCES public.employee(id);
INSERT INTO employee (id, full_name, status) VALUES
(1, 'Employee 1', 7),
(2, 'Employee 2', 4),
(3, 'Employee 3', 9),
(4, 'Employee 4', 3),
(5, 'Employee 5', 5),
(6, 'Employee 6', 1),
(7, 'Employee 7', 2),
(8, 'Employee 8', 4),
(9, 'Employee 9', 9),
(10,'Employee 10', 7);
INSERT INTO join_employee (parent_id, child_id) VALUES
(1, 2),
(4, 5),
(5, 6),
(4, 7),
(7, 8),
(8, 9),
(8, 10);