在Postgres中攀登父/子数据库关系

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函数,但这是为了让父母的孩子.

但是,我对另一个方向感兴趣,给孩子什么是它的顶级父母?我会尝试使用什么类型的查询?

任何友好的建议表示赞赏.

cod*_*gic 1

您可以编写 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 提到的那样,可能值得缓存层次结构,可能使用触发器等。