微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL递归

我需要一个递归查询的帮助.假设下表:
CREATE TEMPORARY TABLE tree (
    id        integer PRIMARY KEY,parent_id integer NOT NULL,name      varchar(50)
);    

INSERT INTO tree (id,parent_id,name) VALUES (3,'Peter'),(2,'Thomas'),(5,2,'David'),(1,'Rob'),(8,'Brian');

我可以通过以下查询检索所有人和他们的孩子的列表:

WITH RECURSIVE recursetree(id,parent_id) AS (
    SELECT id,parent_id FROM tree WHERE parent_id = 0
  UNION
    SELECT t.id,t.parent_id
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
  )
SELECT * FROM recursetree;

我如何按顺序列出它们,并按名称对第一级项目排序?例如,期望的输出将是:

id,name    
8,"Brian"
3,"Peter"
1,0; "Rob"
2,"Thomas"
5,"  David"

谢谢,

**编辑.请注意,添加ORDER BY将不起作用:**

WITH RECURSIVE recursetree(id,path,name) AS (
    SELECT 
        id,array[id] AS path,name 
    FROM tree WHERE parent_id = 0
  UNION ALL
    SELECT t.id,t.parent_id,rt.path || t.id,t.name
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
  )
SELECT * FROM recursetree ORDER BY path;

以上将保留父子关系(孩子跟随他们的父母),但应用任何其他ORDER BY子句(即:名称 – 像有些已经建议)将导致结果失去它的父子关系.

另请参阅这篇关于CTE在Postgresqlwiki.phpfreakz.nl中的文章

编辑:尝试使用数组:

WITH RECURSIVE recursetree(id,parent_ids,firstname) AS (
    SELECT id,NULL::int[] || parent_id,name FROM tree WHERE parent_id = 0
  UNION ALL
    SELECT 
    t.id,rt.parent_ids || t.parent_id,name
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
  )
SELECT * FROM recursetree ORDER BY parent_ids;

原文地址:https://www.jb51.cc/postgresql/192505.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐