2010-07-12 56 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;