hoo*_*knc 6 sql postgresql recursion
我们有以下示例表(实际上取自stackoverflow上的另一个示例...)
CREATE TABLE example (
id integer primary key,
name char(200),
parentid integer,
value integer);
Run Code Online (Sandbox Code Playgroud)
鉴于一个特定的孩子,我们希望获得顶级家长.
我知道tablefunc connectby函数,但这是为了让父母的孩子.
但是,我对另一个方向感兴趣,给孩子什么是它的顶级父母?我会尝试使用什么类型的查询?
任何友好的建议表示赞赏.
您可以编写 PL/PgSQL 函数来执行递归:
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION get_top_parent(
child integer
) RETURNS integer as $$
DECLARE
parent integer;
last_parent integer;
BEGIN
last_parent := child;
SELECT INTO parent parentid
FROM example
WHERE id = child;
IF parent is NOT NULL THEN
parent := get_top_parent(parent);
ELSE
parent := last_parent;
END IF;
RETURN parent;
END
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
这个功能绝对可以优化。如果深度非常高并且表很大,它可能会很慢,所以就像 Jegern 提到的那样,可能值得缓存层次结构,可能使用触发器等。