这里我有一个标准的分层表:
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
答案 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来消除重复