sql - Postgresql 递归返回意外结果

标签 sql postgresql recursion postgresql-9.5

我正在尝试检索特定经理的整个员工层次结构。

表格如下:

id :: int
manager :: foreign key(users)

数据:

| id  | manager | 
-----------------
| 103 | 138     |
| 125 | 138     |
| 114 | 103     |
| 122 | 103     |
| 138 | NULL    |
| 144 | 222     |
| 222 | NULL    |

当我执行以下递归时:

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;

我收到了错误的结果:

enter image description here

虽然预期是:(完全如以下链接所示...)

| employee_id  | manager_id | 
-----------------------------
| 103          | 138        |
| 125          | 138        |
| 114          | 103        |
| 122          | 103        |

我试过很多例子包括::this one ,这与我的问题类似,但没有一个有效......

当我尝试使用 UNION ALL 执行查询时,执行永远不会结束(几分钟后我不得不取消执行)

提前致谢:)

最佳答案

您有一个小错误 - 您需要加入 m.employee_id = u2.manager 而不是 m.employee_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)

关于sql - Postgresql 递归返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42770663/

相关文章:

python - 在 Python Gino 中获取池连接(异步)

javascript - 为什么javascript中递归函数内的循环不完整

python - 计算递归调用中的路径

java - 将递归方法更改为迭代方法

sql - 我应该如何将统计数据保存到数据库

sql - 将 SQL 查询保存到变量

2个表的SQL主键

sql - postgresql join on max(date) 和另一个索引

sql - 为什么我使用这些 postgresql 时态数据库模式和查询得到重复的行?

postgresql - 默认情况下将自定义 Doctrine 输出 walker 应用于所有查询