我知道答案似乎是根据这篇文章使用“WITH RECURSIVE”,但我就是不明白。
我有一张名为 的表people
,还有一张名为 的表position_hierarchy
。该people
表有一个唯一的 iduperson_id
和我们调用的位置 idpcn
和一个enabled
标志(因为当有人离开并被替换时,他们的替换得到相同的pcn
)。有position_hierarchy
列pcn
,另一列reports_to
是pcn
层次结构中高于他们的人的列。我想要做的是给一个人,并在层次结构中uperson_id
找到uperson_id
他们之上的所有人,和/或给一个uperson_id
人和另一个人uperson_id
,并告诉第二个人是否有人对第一个有监督职位。
标明公司总裁是因为他们pcn
和他们一样reports_to
。(不是我的决定 - 我会使用 null reports_to
)
到目前为止我想出的是:
with recursive parents (uperson_id, pcn, reports_to) as
(
select p1.uperson_id, ph1.pcn, ph1.reports_to
from people p1
join position_hierarchy ph1 on ph1.pcn = p1.pcn
where reports_to != ph1.pcn and active_revoke_flag = '0'
union all
select p2.uperson_id, ph2.pcn, ph2.reports_to
from people p2
join position_hierarchy ph2 on p2.pcn = ph2.pcn
join parents pp on pp.pcn = ph2.reports_to
)
select parents.* from parents where uperson_id = 'aaa3644';
但这会返回具有相同 uperson_id、pcn 和 reports_to 的 5 行(这似乎是正确的行数,但我想要主管的 uperson_id 在每个级别。我觉得我错过了一些非常基本的东西,我可能会打耳光当你告诉我我做错了什么时,我的头。
我做了什么
根据Erwin Brandstetter 的回答,我修复了一些问题(主要是因为我没有弄清楚该表在哪个表active_revoke_flag
中)并提出:
with recursive p as (
select pcn, reports_to
from position_hierarchy
where pcn = (SELECT pcn FROM people WHERE uperson_id = 'aaa3644')
union all
select ph2.pcn, ph2.reports_to
from p
join position_hierarchy ph2 ON ph2.pcn = p.reports_to AND
p.pcn != p.reports_to
)
select p2.uperson_id, p2.active_revoke_flag, p.*
from p
join people p2 USING (pcn)
where p2.active_revoke_flag = '0';