2013-10-20 24 views
1

這是一個非常普遍的問題。我發現對SO更具體的問題,一些問題和討論,但我敢肯定,你們中許多人已經解決了這一個:CTE查詢到根元素postgres

輸入:

  1. 有一個樹狀結構的表領域。
  2. 數據庫記錄的任意標識x

問題:

我怎樣才能得到x樹的根?

我發現應該有一種方法來實現這個遞歸,但我還沒有實現它。

+2

文檔中有很好的例子。你有沒有嘗試過使用它們? –

回答

6

可以按照與給定根子元素
相同的方式找到根元素,但查詢必須以相反的方向進行搜索。

看看簡單的演示: - >http://www.sqlfiddle.com/#!12/5952b8/7


該查詢檢索一個給定根的所有兒童:

WITH RECURSIVE childs(id, parent_id) 
AS (
    -- get parent 
    SELECT id, parent_id 
    FROM tab 
    WHERE id = 10 

    UNION ALL 

    -- get all children 
    SELECT t.id, t.parent_id 
    FROM childs c 
    JOIN tab t 
    ON t.parent_id = c.id 
) 
SELECT * from childs; 

這個查詢檢索一個給定的子節點的所有家長:

WITH RECURSIVE parents(id, parent_id) 
AS (
    -- get leaf children 
    SELECT id, parent_id 
    FROM tab 
    WHERE id = 14 

    UNION ALL 

    -- get all parents 
    SELECT t.id, t.parent_id 
    FROM parents p 
    JOIN tab t 
    ON p.parent_id = t.id 
) 
SELECT * from parents 
-- WHERE parent_id is null; 

如果只需要一個根節點,一個條款WHERE parent_id IS NULL過濾掉所有除了根。