これはWITH RECURSIVE
を使用して、現代のPostgresに純粋なSQLで解決することができます。
PostgreSQL 8.3の場合、このplpgsql関数は最新のPostgreSQL用のまともなソリューションですが、ジョブを実行します。
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';
コール:
SELECT * FROM f_get_org_val(123);
あなたは...
が提出されたとして、元の値とデモがfirst_name
を選び、フィールド
ための修正値を取得したいです
これは、すべてのツリーにというルートノードがあることを前提としています210。循環参照がないか、無限ループになります。 xを反復した後にカウンタを追加してループを終了したい場合があります。
実際にデータベースに変更を加えることができないため、アプリケーションでバグ修正を行う必要があります。 – Psyche
つまり、すべてのテーブルに最後の3つのフィールドがありますか? – everton
ほとんどすべてのテーブル、はい。 – Psyche