2016-04-25 7 views
0

私はタスクとサブタスクのPostgreSQLデータベースを持っています。ここで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 

:ここに私の再帰CTEステートメントがある言い換えれば、表示のみ "木の葉 "。

後者のクエリの出力は表だったか、私は「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クエリのエイリアスを行い、これら2つのクエリを1つに結合できますか?複数WITHsを使用して

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); 

答えて

0

ル出来上がり... ...。

関連する問題