rob*_*dog 5 sql postgresql recursion
我在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子句。
谢谢,
这是未经测试的,但通常我可以在联合之前添加任何 ORDER BY,只要有括号......
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
ORDER BY title
)
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)
创建一个由查询的第一部分组成的视图,按标题排序。也许是这样的?
CREATE VIEW title_Sort AS
SELECT id,
title,
array[id] AS path,
parent_id,
1 AS depth
FROM emails
WHERE parent_id IS NULL
ORDER BY title;
Run Code Online (Sandbox Code Playgroud)
然后像之前一样将该视图与其他查询联合起来。我认为这会起作用。现在在我的上网本上,所以我无法测试:/
| 归档时间: |
|
| 查看次数: |
3997 次 |
| 最近记录: |