[英]Recursive Self-Join in postgres
我有一个profiles
表,其中包含与用户经理相关的数据。
一个用户可以有多个级别的管理员。
我需要编写一个查询来获取用户的所有管理员。
官方manager_id
存储在列text
= A
中。
表名称profiles
ID | 文本 | manager_id | 用户身份 |
---|---|---|---|
1个 | 一种 | 20 | 50 |
2个 | 乙 | 20 | 50 |
3个 | 一种 | 21 | 20 |
4个 | 乙 | NULL | 20 |
5个 | C | NULL | 20 |
6个 | 一种 | 22 | 21 |
7 | 乙 | NULL | 21 |
9 | 一种 | NULL | 22 |
例如,
如果user_id=50
那么,
50
经理就是20
20
经理是21
21
经理是22
21
经理的是NULL
所以,output 应该是20,21,22
同样,如果user_id=20
output 应该是21,22
我尝试了几个查询,但没有返回预期的 output。
您正在寻找的递归查询应该具有:
获得所有匹配项后,您可以通过“ user_id ”和ARRAY_AGG
聚合您的值。
WITH RECURSIVE cte AS (
SELECT DISTINCT user_id, manager_id
FROM tab
WHERE manager_id IS NOT NULL
UNION ALL
SELECT usr.user_id,
mgr.manager_id
FROM cte usr
INNER JOIN tab mgr
ON usr.manager_id = mgr.user_id
WHERE mgr.manager_id IS NOT NULL
)
SELECT user_id,
ARRAY_AGG(manager_id) AS managers
FROM cte
GROUP BY user_id
在此处查看演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.