Prostsza funkcja
Przede wszystkim możesz uprościć twoja funkcja całkiem sporo. Ta prostsza funkcja SQL robi to samo:
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;
Zadzwoń:
select * from f_tree(15);
-
możesz użyj plpgsql, może być nieco korzystne dla spieniężenia planu zapytań w wersjach przed PostgreSQL 9.2. Ale pozbyłeś się jedynej teoretycznej korzyści, używając dynamicznego SQL bez potrzeby. To w ogóle nie ma sensu. Uprość do zwykłego SQL.
-
Użyj
UNION ALL
zamiastUNION
, tańsze, ponieważ z założenia nie może być duplikatów.
Tylko SQL
Oczywiście możesz to zastąpić zwykłym 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;
Robi to samo.
WIDOK
Teraz VIEW
to banalna sprawa:
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;
Wynik nie ma dla mnie większego sensu, ale pytanie nie definiuje niczego sensowniejszego..