Postgresql递归返回意外结果
我试图检索特定经理的整个员工层次结构 下表如下:Postgresql递归返回意外结果,sql,postgresql,recursion,postgresql-9.5,Sql,Postgresql,Recursion,Postgresql 9.5,我试图检索特定经理的整个员工层次结构 下表如下: id :: int manager :: foreign key(users) 数据: 当我执行以下递归时: WITH RECURSIVE managed AS ( SELECT manager AS manager_id, id AS employee_id FROM users WHERE manager = 138 UNION SELECT u2.manager A
id :: int
manager :: foreign key(users)
数据:
当我执行以下递归时:
WITH RECURSIVE managed AS (
SELECT manager AS manager_id, id AS employee_id
FROM users
WHERE manager = 138
UNION
SELECT u2.manager AS manager_id, u2.id as employee_id
FROM users u2
INNER JOIN managed m ON m.employee_id = u2.id
)
select *
from managed;
我收到了错误的结果:
而预期的结果是:(正如下面的链接所示…)
我尝试了很多例子,包括:,这与我的问题相似,但没有一个有效
当我尝试使用UNION ALL
执行查询时,执行从未结束(几分钟后,我不得不取消执行)
提前感谢:)以下是如何查找员工层次结构:
WITH managers AS (
SELECT u.id
FROM users u
WHERE exists (SELECT 1 FROM users WHERE manager = u.id LIMIT 1)
)
SELECT u.id as employee_id, m.id as manager_id
FROM users u
JOIN managers m ON m.id = u.manager;
->
您有一个小错误-您需要加入
m.employee\u id=u2.manager
而不是m.employee\u id=u2.id
:
WITH RECURSIVE managed AS (
SELECT manager AS manager_id, id AS employee_id
FROM users
WHERE manager = 138
UNION
SELECT u2.manager AS manager_id, u2.id as employee_id
FROM users u2
INNER JOIN managed m ON m.employee_id = u2.manager
)
select *
from managed;
结果是:
manager_id | employee_id
------------+-------------
138 | 103
138 | 125
103 | 114
103 | 122
(4 rows)
Hi@Gab谢谢你的回答,但是这并不能解决我的问题,因为它会返回整个公司的层级结构(没有顶级经理,那些经理为空的)。我正在尝试检索特定管理器的层次结构。要返回公司层次结构,我可以从manager不为NULL的用户中执行
SELECT*
Hi@OldFox我有点困惑,因为你的问题给出了预期的结果,而我的答案符合你的预期结果。如果不是你想要的结果,你能更新预期结果吗?我已经更新了我的问题;给定的数据集和预期的结果。我已经稍微更新了我的答案,我的查询结果正是您的问题的“预期结果”。对不起,但它不起作用。。。答案将返回144 | 222
,但它不应该返回,因为用户222不是用户138的层次结构的一部分。我确信我已经尝试过了。。。谢谢,它有效:)
employee_id | manager_id
-------------+------------
122 | 103
114 | 103
103 | 138
125 | 138
(4 rows)
WITH RECURSIVE managed AS (
SELECT manager AS manager_id, id AS employee_id
FROM users
WHERE manager = 138
UNION
SELECT u2.manager AS manager_id, u2.id as employee_id
FROM users u2
INNER JOIN managed m ON m.employee_id = u2.manager
)
select *
from managed;
manager_id | employee_id
------------+-------------
138 | 103
138 | 125
103 | 114
103 | 122
(4 rows)