【问题标题】:What is the proper syntax for aliasing a recursive CTE in SQL?在 SQL 中为递归 CTE 起别名的正确语法是什么?
【发布时间】: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


    【解决方案1】:

    瞧瞧……

    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。

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 2018-11-14
      • 2016-12-09
      • 2018-06-08
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多