在 SQL 中为递归 CTE 取别名的正确语法是什么?

What is the proper syntax for aliasing a recursive CTE in SQL?

我有一个任务和子任务的 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

我想在删除也是父结果的语句中集成一个操作:换句话说,只显示树的'leaves'。

如果后一个查询的输出是 table,或者如果我将结果假脱机到一个名为 'temptab' 的临时 table,我想 运行像这样的查询:

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 查询取别名并将这两个查询合并为一个吗?

瞧瞧...

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

...使用多个 WITH。