Fonction simplifiée
Tout d'abord, vous pouvez simplifier votre fonction un peu. Cette fonction SQL plus simple fait la même chose :
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;
Appel :
select * from f_tree(15);
-
Vous pourriez utiliser plpgsql, peut-être légèrement bénéfique pour encaisser le plan de requête dans les versions antérieures à PostgreSQL 9.2. Mais vous avez annulé le seul avantage théorique en utilisant SQL dynamique sans besoin. Cela n'a aucun sens. Simplifiez en SQL brut.
-
Utilisez
UNION ALL
au lieu deUNION
, moins cher car il ne peut pas y avoir de dupes par conception.
Juste SQL
Évidemment, vous pouvez remplacer ceci par du SQL simple :
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;
Fait la même chose.
VOIR
Maintenant, la VIEW
est une question triviale :
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;
Le résultat n'a pas beaucoup de sens pour moi, mais la question ne définit rien de plus sensé ..