从 parent 元素获取属性值 - 只需 sql
Get attribute values from parent element - just by sql
- 我和员工有一个 table。
- 每个员工可以有一个 boss/parent(但也可以为空)。
- 每个顶级员工在 floor 列中都有一个值。
- 他的所有children都继承了这个
代码中的值,但不在数据库中。
示例:
| id | name | parent_id | floor |
|----------------------------------------|
| 1 | boss1 | null | green |
| 2 | emp1 | 1 | null |
| 3 | boss2 | null | blue |
| 4 | emp3 | 3 | null |
| 5 | emp4 | 2 | null |
现在我想回答一个问题,例如,哪些员工在绿色楼层工作(显而易见的答案:boss1、emp1 和 emp4)?我知道这在编程上很容易,但我只想使用 SQL (Postgres) 来完成。
提前致谢!
您需要 recursive common table expression 才能遍历树。您还需要 "carry" 从父级到子级的非空值来模拟值的继承。
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;
鉴于您的示例数据,上述 returns:
id | name | parent_id | floor
---+-------+-----------+------
1 | boss1 | | green
3 | boss2 | | blue
2 | emp1 | 1 | green
4 | emp3 | 3 | blue
5 | emp4 | 2 | green
现在可以通过在最终 select.
中添加 WHERE
条件,将其更改为 return 所有带有绿色地板的行
with recursive tree as (
... as above ...
)
select *
from tree
where floor = 'green';
- 我和员工有一个 table。
- 每个员工可以有一个 boss/parent(但也可以为空)。
- 每个顶级员工在 floor 列中都有一个值。
- 他的所有children都继承了这个 代码中的值,但不在数据库中。
示例:
| id | name | parent_id | floor |
|----------------------------------------|
| 1 | boss1 | null | green |
| 2 | emp1 | 1 | null |
| 3 | boss2 | null | blue |
| 4 | emp3 | 3 | null |
| 5 | emp4 | 2 | null |
现在我想回答一个问题,例如,哪些员工在绿色楼层工作(显而易见的答案:boss1、emp1 和 emp4)?我知道这在编程上很容易,但我只想使用 SQL (Postgres) 来完成。
提前致谢!
您需要 recursive common table expression 才能遍历树。您还需要 "carry" 从父级到子级的非空值来模拟值的继承。
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;
鉴于您的示例数据,上述 returns:
id | name | parent_id | floor
---+-------+-----------+------
1 | boss1 | | green
3 | boss2 | | blue
2 | emp1 | 1 | green
4 | emp3 | 3 | blue
5 | emp4 | 2 | green
现在可以通过在最终 select.
中添加WHERE
条件,将其更改为 return 所有带有绿色地板的行
with recursive tree as (
... as above ...
)
select *
from tree
where floor = 'green';