По-проста функция
Преди всичко можете да опростите вашата функция доста. Тази по-проста 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, може да е леко полезно за осребряване на плана за заявка във версии преди PostgreSQL 9.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;
Резултатът няма много смисъл за мен, но въпросът не определя нищо по-разумно ..