假设我有以下表结构:函数返回一个节点的所有子节点的表
| 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。 –