Вам нужно рекурсивное общее табличное выражение , чтобы пройти по дереву.Вам также необходимо «передать» ненулевые значения от родителя к потомкам, чтобы имитировать наследование значений.
with recursive tree as (
select id, name, parent_id, floor
from employees
where parent_id is null
union all
select c.id, c.name, c.parent_id, coalesce(c.floor, p.floor) as floor
from employees c
join tree p on p.id = c.parent_id
)
select *
from tree;
Учитывая ваши данные примера, вышеприведенное возвращает:
id | name | parent_id | floor
---+-------+-----------+------
1 | boss1 | | green
3 | boss2 | | blue
2 | emp1 | 1 | green
4 | emp3 | 3 | blue
5 | emp4 | 2 | green
Теперь это можно изменить, чтобы вернуть все строки с зеленым полом, добавив условие WHERE
к финальномувыберите.
with recursive tree as (
... as above ...
)
select *
from tree
where floor = 'green';
Онлайн пример: https://rextester.com/UQJVF54349