小编rob*_*dog的帖子

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, 0, 'Peter'), (2,0, 'Thomas'), (5,2, 'David'), (1, 0, 'Rob'), (8, 0, 'Brian');
Run Code Online (Sandbox Code Playgroud)

我可以使用以下查询检索所有人及其子女的列表:

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;
Run Code Online (Sandbox Code Playgroud)

如何按顺序列出它们,还可以按名称对第一级项目进行排序?例如,所需的输出将是:

id, parent_id, name    
8, 0, "Brian"
3, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql recursion

13
推荐指数
1
解决办法
9979
查看次数

在Postgres中订购WITH RECURSIVE查询

我在Postgres中执行递归查询,以检索电子邮件及其线程子项的列表,如下所示:

WITH RECURSIVE cte (id, title, path, parent_id, depth)  AS (
  SELECT  id, 
          title,
          array[id] AS path,
          parent_id, 
          1 AS depth
  FROM    emails
  WHERE   parent_id IS NULL

  UNION ALL

  SELECT  emails.id,
          emails.title,
          cte.path || emails.id,
          emails.parent_id, 
          cte.depth + 1 AS depth
  FROM    emails
          JOIN cte ON emails.parent_id = cte.id
)
SELECT id, title, path, parent_id, depth FROM cte
ORDER BY path;
Run Code Online (Sandbox Code Playgroud)

在查找子级电子邮件之前,如何更改列表的顺序(例如,按标题排序)。我显然需要保留外部的ORDER BY,以便按树顺序检索列表,而Postgres不允许我在UNION ALL之前插入ORDER BY子句。

谢谢,

sql postgresql recursion

5
推荐指数
2
解决办法
3997
查看次数

标签 统计

postgresql ×2

recursion ×2

sql ×2