2016-04-25 26 views
0

我有一個任務和子任務的PostgreSQL數據庫。這裏是我的遞歸CTE聲明:什麼是在SQL中使用遞歸CTE進行別名的正確語法?

WITH RECURSIVE getchildren (childname, childid, parentid, parentname) AS (
    SELECT child.name,child.id,child.parent,parent.name 
    FROM lists child, lists parent 
    WHERE child.parent=parent.id AND parent.id=30 
    UNION ALL 
    SELECT l.name,l.id,l.parent,g.childname 
    FROM lists l, getchildren g 
    WHERE l.parent=g.childid 
) 
SELECT childid,childname,parentid,parentname 
FROM getchildren; 

這裏是輸出:

childid |   childname   | parentid | parentname 
---------+-----------------------------+-------------+----------------- 
     46 | Fix Escaped Chars   |   30 | List Program 
     51 | Add Comments    |   30 | List Program 
     47 | Rename Task     |   30 | List Program 
     36 | Dependencies    |   30 | List Program 
     34 | Obfuscate ID    |   30 | List Program 
     37 | Move Task     |   36 | Dependencies 
     82 | Second Order    |   36 | Dependencies 
     38 | Reorder      |   36 | Dependencies 
     83 | Third Order     |   82 | Second Order 

我想要的操作集成到刪除的結果,同時也是父母的聲明:換句話說,只顯示「樹葉'。

如果是後者查詢的輸出是一個表,或者如果我後臺處理結果到一個名爲「temptab」臨時表,我想運行這樣的查詢:

select childname from temptab where childname not in (select parentname from temptab); 

取得成果像這樣:

childid |   childname   | parentid | parentname 
---------+-----------------------------+-------------+----------------- 
     46 | Fix Escaped Chars   |   30 | List Program 
     51 | Add Comments    |   30 | List Program 
     47 | Rename Task     |   30 | List Program 
     34 | Obfuscate ID    |   30 | List Program 
     37 | Move Task     |   36 | Dependencies 
     38 | Reorder      |   36 | Dependencies 
     83 | Third Order     |   82 | Second Order 

我可以將第一個遞歸CTE查詢別名並將這兩個查詢合併爲一個嗎?

回答

0

樂瞧...

WITH RECURSIVE getchildren(childname,childid,parentid,parentname) AS (
    SELECT child.name,child.id,child.parent,parent.name 
    FROM lists child, lists parent 
    WHERE child.parent=parent.id AND parent.id=39 
    UNION ALL 
    SELECT l.name,l.id,l.parent,g.childname 
    FROM lists l, getchildren g 
    WHERE l.parent=g.childid), 
    nonatomic AS (SELECT parentname FROM getchildren) 
SELECT childname 
    FROM getchildren 
    WHERE childname 
    NOT IN (SELECT * FROM nonatomic); 

...使用多個WITHs。