2014-04-28 46 views
1

在這裏,我有一個標準的分級表:如何在遞歸CTE中做一個UNION?

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','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

回答

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查詢以消除重複項

+0

注意:使用遞歸cte(「IN NER JOIN成員「)必須在子查詢的外部進行,以避免」子查詢中的遞歸引用「錯誤。 –

+0

'INNER JOIN members'在外面。 groupWithAliases子查詢中有一個UNION,但它不使用成員CTE,所以它應該可以正常工作。不幸的是,SQL小提琴目前並不適合我,所以我無法測試它 – cha

+0

對不起,我打算將它作爲基於我遇到的內容的額外註釋註釋,而不是對您的示例提出的修改。 –