Función más simple
En primer lugar, puede simplificar su función un poco. Esta función SQL más simple hace lo mismo:
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;
Llamar:
select * from f_tree(15);
-
podrías use plpgsql, podría ser ligeramente beneficioso para cobrar el plan de consulta en versiones anteriores a PostgreSQL 9.2. Pero anuló el único beneficio teórico al usar SQL dinámico sin necesidad. Esto no tiene ningún sentido. Simplificar a SQL simple.
-
Usa
UNION ALL
en lugar deUNION
, más barato ya que no puede haber engaños por diseño.
Solo SQL
Obviamente, puede reemplazar esto con 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;
Hace lo mismo.
VER
Ahora, el VIEW
es un asunto trivial:
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;
El resultado no tiene mucho sentido para mí, pero la pregunta no define nada más sensato..