PostgreSQL:运行 CTE,然后在 CTE 上递归查询

PostgreSQL: Run CTE and then Recursive query on the CTE

我正在尝试 运行 PostgreSQL 中的递归查询。我需要它来找到属于团队的所有人。查询如下:

WITH TAB AS (
SELECT id as user_id, team_id
from users

union

select user_id,team_id
from team_units
),
RECURSIVE recuree AS (
    SELECT user_id, team_id
    from TAB
    
    UNION
    
    SELECT E.user_id, E.team_id
    from TAB E
    JOIN recuree S on E.team_id = S.team_id)

SELECT * FROM recuree

我读到 RECURSIVE 必须始终跟在 WITH 之后。 但是,由于 TAB table 实际上并不存在,这怎么可能发生呢?

提前致谢。

您可能需要使用 WITH RECURSIVE,因此您可以尝试使用子查询来代替 TAB

RECURSIVE 需要使用 UNION ALL 而不是 UNION

WITH RECURSIVE recuree AS (
    SELECT user_id, team_id
    from (
        SELECT id as user_id, team_id
        from users
        union
        select user_id,team_id
        from team_units
    ) t1
    UNION ALL
    SELECT E.user_id, E.team_id
    from (
        SELECT id as user_id, team_id
        from users
        union
        select user_id,team_id
        from team_units
    ) E
    JOIN recuree S on E.team_id = S.team_id
)
SELECT * 
FROM recuree

否则,您可以先尝试创建视图

CREATE VIEW v_TAB AS 
SELECT id as user_id, team_id
from users
union
select user_id,team_id
from team_units;

然后做 CTE RECURSIVE

WITH RECURSIVE recuree AS (
    SELECT user_id, team_id
    from v_TAB
    UNION ALL
    SELECT E.user_id, E.team_id
    from v_TAB E
    JOIN recuree S on E.team_id = S.team_id
)
SELECT * 
FROM recuree;