我需要一个递归查询的帮助.假设如下表:
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) 我在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子句。
谢谢,