2010-07-12 54 views
3

我在执行Postgres的递归查询检索电子邮件和他们的孩子螺纹的名单如下订购一个与递归查询: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; 

会如何改变列表的顺序(例如对标题进行排序),然后找到孩子的电子邮件。我显然需要保留外部的ORDER BY,以便按树的顺序检索列表,并且Postgres不会让我在UNION ALL之前插入ORDER BY子句。

感谢,

回答

2

创建一个由您的查询,按标题排序的第一部分的示意图。也许这样?

 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; 

然后UNION ALL查看您的其他查询,就像您之前做过的那样。我认为这将起作用。在我的上网本,现在,所以我不能测试:/

+0

不幸的是没有按没有工作。您的方法允许我在第一个查询中执行ORDER BY,但最后的ORDER BY路径将始终取代它 - 结果是列表本质上是按ID排序的。 – robdog 2010-07-12 13:11:01

+0

嗯,那么我不知道你在问什么......最后的ORDER BY将始终使结果表按路径排序。你需要什么来命令它中间查询?你试图做什么是顺序依赖? – rownage 2010-07-12 13:34:49

+0

我想检索线程邮件列表,维护它们的树结构 - 上面的查询让我做 - 并且能够按标题对顶级项目进行排序。 – robdog 2010-07-12 13:54:36

1

这是未经测试,但通常我可以在联盟前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;