假設我有以下表結構:函數返回一個節點的所有子節點的表
| ID | ParentID |名稱|
我想寫一個遞歸的PostgreSQL函數來獲取傳遞給它的節點ID的所有子節點作爲參數。
這裏是我到目前爲止的代碼(我只有它獲取傳遞ID的所有子功能的一部分,現在我需要遞歸部分):
CREATE OR REPLACE FUNCTION GetAllChildren(IN NodeID INTEGER) RETURNS INTEGER AS $$
DECLARE
Crs CURSOR FOR SELECT ID, ParentID, Name FROM Tree WHERE ParentID=NodeID;
VarRow Tree%ROWTYPE;
BEGIN
OPEN Crs;
CREATE TEMPORARY TABLE TBL(
ID SERIAL,
ParentID INTEGER,
Name CHARACTER(100)
);
LOOP
FETCH Crs INTO VarRow;
IF VarRow IS NULL THEN
EXIT;
END IF;
INSERT INTO TBL(ID, ParentID, Name) VALUES(VarRow.ID, VarRow.ParentID, VarRow.Name);
END LOOP;
CLOSE Crs;
RETURN 0;
END;
$$ LANGUAGE plpgsql;
也許最大的問題是,我不知道遞歸調用之間的輸出保存在哪裏。
如果你到目前爲止還沒有弄清楚,那就是關於鄰接表,獲得一個節點的所有子節點並將它們打印到一張表中。
有沒有人有解決方案?
什麼是「它」? Postgres維基文章的歷史可以追溯到2009年。Google的結果往往過時。 Denis提出的遞歸CTE要好得多。 –
爲什麼rCTE解決方案會更好?請解釋。 – 2013-06-26 20:23:53
Postgres中的數組處理相對較慢。 PL/pgSQL中的循環和分配相對較慢。遞歸CTE更短,更簡單,可能更快,如果你不僅需要每行ID。並且大部分可移植到其他RDBMS。 –