【发布时间】:2019-02-03 08:07:56
【问题描述】:
我认为我不太了解递归查询。我看到的经典递归查询是经理和员工递归查询。我正在使用该查询来捕获整个层次结构,但是我想进行一个查询,使我能够捕获所有父母、孩子及其级别(相对于顶层)。我觉得我需要对递归查询进行递归?
WITH RECURSIVE
tree AS (
SELECT
id_employee,
id_manager,
0 AS level
FROM
people
WHERE
id_manager = '00001'--this is the boss of all bosses
UNION ALL
SELECT
p.id_employee,
p.id_manager,
t.level + 1 AS level
FROM
(
SELECT
id_employee,
id_manager
FROM
people
) p
JOIN tree t ON p.manager_id = t.employee_id
)
SELECT *
FROM
tree;
所以现在,既然我得到了顶级老板00001,那么我将得到组织中的每个人。但是,如果我在最后一行为处于层级中间的某个人添加WHERE id_manager = 子句,我只会得到他们的直接下属。我想检索该经理下方的所有直接下属,以及这些经理下方的报告。
有没有办法修改此构建/修改此查询以维护上面的整个层次结构,但也能够查询它以识别其中的某个人、他们的所有孩子以及他们与顶部的相对级别级boss?
谢谢!
【问题讨论】:
-
如果我添加
WHERE id_manager=是什么意思?如果您替换您当前的WHERE id_manager = '00001' --this is the boss of all bosses由您想要的经理,那还不够吗? ? -
@lau - 抱歉,我不清楚。我的意思是我想将
WHERE id_manager=添加到查询的最后一行。现在,如果我这样做,我只会得到00555的直接下属,而不是那些下属的下属。理想情况下,递归查询应该为每个父母的每个孩子返回多条记录。 -
就像提示一样——在 manager Id 字段上添加一个聚集索引(您可能必须删除并重新创建主键字段才能执行此操作)。这将使父子查询速度至少提高一个数量级。
标签: sql postgresql recursion