你如何在递归CTE中做一个UNION?

时间:2014-04-28 23:44:38

标签: sql sqlite

这里我有一个标准的分层表:

CREATE TABLE GroupMembers (
   group_id    VARCHAR,
   member_id   VARCHAR
);

INSERT INTO GroupMembers VALUES
    ('1', '10'),
    ('1', '11'),
    ('10','100'),
    ('10','101'),
    ('20','200'),
    ('20','201');

现在让小组的所有成员' 1'我这样做:

WITH RECURSIVE members(id) AS (
   VALUES('1')
   UNION
   SELECT gm.member_id
   FROM GroupMembers gm
   INNER JOIN members m ON gm.group_id=m.id
)
SELECT * FROM members;

产生:' 1',' 10',' 11',' 100',' 101'

现在出现了新的皱纹:我有ids的别名

CREATE TABLE Aliases (
   member_id  VARCHAR,
   alias_id   VARCHAR
);

INSERT INTO Aliases(member_id, alias_id) VALUES
    ('11', '20');

现在我想得到所有成员。因为' 11'是' 20'的别名,结果应该是:' 1',' 10',' 11',' 100& #39;,' 101',' 200',' 201'。

我尝试了以下查询:

WITH RECURSIVE members(id) AS (
   VALUES('1')
   UNION
   SELECT gm.member_id
   FROM GroupMembers gm
   INNER JOIN members m ON gm.group_id=m.id
   UNION
   SELECT a.alias_id
   FROM Aliases
   INNER JOIN members m ON gm.group_id=m.id
)
SELECT * FROM members;

但我收到错误circular reference: members

1 个答案:

答案 0 :(得分:2)

这个怎么样:

WITH RECURSIVE members(id) AS (
   VALUES('1')
   UNION
   SELECT groupWithAliases.member_id
   FROM 
   ( SELECT group_id, member_id FROM GroupMembers 
     UNION
     SELECT alias_id AS group_id, member_id
     FROM Aliases ) groupWithAliases
   INNER JOIN members m ON groupWithAliases.group_id=m.id
)
SELECT * FROM members;

请注意我在构造groupWithAliases子查询时使用UNION来消除重复