Это можно решить с помощью чистого SQL в современных Postgres, используя WITH RECURSIVE
.
Для PostgreSQL 8.3 , эта функция plpgsql выполняет свою работу, в то же времядостойное решение для современного PostgreSQL.Вы хотите ..
получить исходное значение и измененное значение для поля
Демонстрация выбирает first_name
в поле:
CREATE OR REPLACE FUNCTION f_get_org_val(integer
, OUT first_name_curr text
, OUT first_name_org text) AS
$func$
DECLARE
_parent_id int;
BEGIN
SELECT INTO first_name_curr, first_name_org, _parent_id
first_name, first_name, audit_parent_id
FROM tbl
WHERE id = $1;
WHILE _parent_id <> 0
LOOP
SELECT INTO first_name_org, _parent_id
first_name, audit_parent_id
FROM tbl
WHERE id = _parent_id;
END LOOP;
END
$func$ LANGUAGE plpgsql;
COMMENT ON FUNCTION f_get_org_val(int) IS 'Get current and original values for id.
$1 .. id';
Call:
SELECT * FROM f_get_org_val(123);
Предполагается, что все деревья имеют корневой узел с parent_id = 0
.Никаких циклических ссылок, или вы получите бесконечный цикл.Возможно, вы захотите добавить счетчик и выйти из цикла после x итераций.