2015-05-19 82 views
1

我正在進行查詢以將數據拉出層次結構Postgresql遞歸CTE結果排序

例如,

CREATE table org (
    id INT PRIMARY KEY, 
    name TEXT NOT NULL, 
    parent_id INT); 

INSERT INTO org (id, name) VALUES (0, 'top'); 
INSERT INTO org (id, name, parent_id) VALUES (1, 'middle1', 0); 
INSERT INTO org (id, name, parent_id) VALUES (2, 'middle2', 0); 
INSERT INTO org (id, name, parent_id) VALUES (3, 'bottom3', 1); 

WITH RECURSIVE parent_org (id, parent_id, name) AS (
    SELECT id, parent_id, name 
    FROM org 
    WHERE id = 3 
UNION ALL 
    SELECT o.id, o.parent_id, o.name 
    FROM org o, parent_org po 
    WHERE po.parent_id = o.id) 
SELECT id, parent_id, name 
FROM parent_org; 

它按預期工作。

3 1 "bottom3" 
1 0 "middle1" 
0 "top" 

它也返回數據的順序,我希望,這對我來說很有意義,它會做的,因爲結果將被發現的方式這一點。

問題是,我可以指望是這樣的順序嗎?

回答

2

是的,有一個定義的順序。在PostgresWITH doc,他們給了下面的例子:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
     SELECT g.id, g.link, g.data, 1, 
      ARRAY[ROW(g.f1, g.f2)], 
      false 
     FROM graph g 
     UNION ALL 
     SELECT g.id, g.link, g.data, sg.depth + 1, 
      path || ROW(g.f1, g.f2), 
      ROW(g.f1, g.f2) = ANY(path) 
     FROM graph g, search_graph sg 
     WHERE g.id = sg.link AND NOT cycle 
) 
SELECT * FROM search_graph; 

關於他們在提示箱說(格式化礦):

遞歸查詢評估算法產生的輸出 廣度 - 第一個搜索順序。您可以在深度優先顯示結果 搜索順序通過使外部查詢ORDER BY這樣構建的「路徑」列 。

你似乎讓你的情況基礎上,INSERT上述聲明廣度優先輸出,所以我會說你可以,如果你想修改你的外部SELECT它下令以另一種方式。

我相信類似物對深度優先你的情況很可能是這樣的:

WITH RECURSIVE parent_org (id, parent_id, name) AS (
    SELECT id, parent_id, name 
    FROM org 
    WHERE id = 3 
UNION ALL 
    SELECT o.id, o.parent_id, o.name 
    FROM org o, parent_org po 
    WHERE po.parent_id = o.id) 
SELECT id, parent_id, name 
FROM parent_org 
ORDER BY id; 

正如我希望(通過在我的頭腦裏的東西),要得到這樣的:

0 "top" 
1 0 "middle1" 
3 1 "bottom3"