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