ruby-on-rails postgres中的递归自连接

xxls0lw8  于 2023-01-22  发布在  Ruby
关注(0)|答案(1)|浏览(158)

我有一个表profiles,其中包含与用户的管理员相关的数据。
一个用户可以有多个级别的经理。
我需要编写一个查询来获取一个用户的所有管理员。
正式的manager_id存储在text = A列中。
表格名称profiles
| 身份证|正文|经理标识|用户标识|
| - ------|- ------|- ------|- ------|
| 1个|A类|二十个|五十|
| 第二章|乙|二十个|五十|
| 三个|A类|二十一|二十个|
| 四个|乙|零|二十个|
| 五个|C级|零|二十个|
| 六个|A类|二十二|二十一|
| 七|乙|零|二十一|
| 九|A类|零|二十二|
例如,
如果user_id=50那么,
50管理器的是20
20管理器的是21
21管理器的是22
21管理器的是NULL
因此,输出应为20,21,22
同样,如果user_id=20,则输出应为21,22
我尝试了几个查询,但它没有返回预期的输出。

f0brbegy

f0brbegy1#

您要查找的递归查询应该具有以下特性:

  • 一个基本步骤,从输入表中不同的user_id和manager_id对开始
  • 递归步骤,其将所述表与当前递归结果自联接,将所述第二管理者匹配为所述第一管理者的用户

获得所有匹配项后,可以通过ARRAY_AGG按"* user_id *"聚合值。

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

检查here演示。

相关问题