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)