【发布时间】:2023-03-24 02:45:01
【问题描述】:
我有一个包含任务和子任务的 PostgreSQL 数据库。这是我的递归 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 查询设置别名并将这两个查询合并为一个吗?
【问题讨论】:
标签: postgresql recursion common-table-expression