Postgresql 递归 return 意外结果
Postgresql recursion return an unexpected result
我正在尝试检索特定经理的整个员工层次结构。
table如下:
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;
我收到错误的结果:
虽然预期是:(完全如下面 link 显示...)
| employee_id | manager_id |
-----------------------------
| 103 | 138 |
| 125 | 138 |
| 114 | 103 |
| 122 | 103 |
我尝试了很多示例,包括 :: this one,这与我的问题类似,但其中 none 个有效...
当我尝试使用 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;
->
employee_id | manager_id
-------------+------------
122 | 103
114 | 103
103 | 138
125 | 138
(4 rows)
您有一个小错误 - 您需要加入 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)
我正在尝试检索特定经理的整个员工层次结构。
table如下:
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;
我收到错误的结果:
虽然预期是:(完全如下面 link 显示...)
| employee_id | manager_id |
-----------------------------
| 103 | 138 |
| 125 | 138 |
| 114 | 103 |
| 122 | 103 |
我尝试了很多示例,包括 :: this one,这与我的问题类似,但其中 none 个有效...
当我尝试使用 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;
->
employee_id | manager_id
-------------+------------
122 | 103
114 | 103
103 | 138
125 | 138
(4 rows)
您有一个小错误 - 您需要加入 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)