よりシンプルな機能
まず、簡素化できます あなたの機能はかなりです。この単純なSQL関数は同じことをします:
CREATE OR REPLACE FUNCTION f_tree(_rev int)
RETURNS TABLE(id int, parent_id int, depth int) AS
$func$
WITH RECURSIVE tree_list AS (
SELECT t.id, t.parent_id, 1 -- AS depth
FROM tree t
WHERE t.id = $1
UNION ALL -- no point using UNION
SELECT t.id, t.parent_id, r.depth + 1
FROM tree_list r
JOIN tree t ON t.id = r.parent_id
)
SELECT t.id, t.parent_id, t.depth
FROM tree_list t
ORDER BY t.id;
$func$ LANGUAGE sql;
電話:
select * from f_tree(15);
-
あなたはできた plpgsqlを使用します。少しかもしれません PostgreSQL9.2より前のバージョンでクエリプランをキャッシュするのに役立ちます。しかし、動的SQLを必要とせずに使用することで、理論上の唯一の利点を無効にしました。これはまったく意味がありません。単純化してプレーンSQLにします。
-
UNION ALL
を使用するUNION
の代わりに 、設計上重複がないため、より安価です。
SQLだけ
もちろん、これをプレーンSQLに置き換えることができます:
WITH RECURSIVE tree_list AS (
SELECT t.id, t.parent_id, 1 AS depth
FROM tree t
WHERE t.id = 15 -- enter parameter here
UNION ALL
SELECT t.id, t.parent_id, r.depth + 1
FROM tree_list r
JOIN tree t ON t.id = r.parent_id
)
SELECT t.id, t.parent_id, t.depth
FROM tree_list t
ORDER BY t.id;
同じことをします。
表示
さて、VIEW
些細なことです:
CREATE OR REPLACE VIEW v_tree15 AS
WITH RECURSIVE tree_list AS (
SELECT t.id, t.parent_id, 1 AS depth
FROM tree t
WHERE t.id <= 15 -- only detail to change
UNION ALL
SELECT t.id, t.parent_id, r.depth + 1
FROM tree_list r
JOIN tree t ON t.id = r.parent_id
)
SELECT t.id, t.parent_id, t.depth
FROM tree_list t
ORDER BY t.id;
結果は私にはあまり意味がありませんが、質問はより賢明なものを定義していません..