繁体   English   中英

postgres 中的递归自连接

[英]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 和 manager_id 对开始
  • 递归步骤,将表与当前递归结果自连接,将第二个的经理匹配为第一个的用户

获得所有匹配项后,您可以通过“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM