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;
我正在尝试 运行 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;