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