1
這是一個非常普遍的問題。我發現對SO更具體的問題,一些問題和討論,但我敢肯定,你們中許多人已經解決了這一個:CTE查詢到根元素postgres
輸入:
- 有一個樹狀結構的表領域。
- 數據庫記錄的任意標識
x
。
問題:
我怎樣才能得到x
樹的根?
我發現應該有一種方法來實現這個遞歸,但我還沒有實現它。
這是一個非常普遍的問題。我發現對SO更具體的問題,一些問題和討論,但我敢肯定,你們中許多人已經解決了這一個:CTE查詢到根元素postgres
輸入:
x
。問題:
我怎樣才能得到x
樹的根?
我發現應該有一種方法來實現這個遞歸,但我還沒有實現它。
可以按照與給定根子元素
相同的方式找到根元素,但查詢必須以相反的方向進行搜索。
看看簡單的演示: - >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
過濾掉所有除了根。
文檔中有很好的例子。你有沒有嘗試過使用它們? –