Funzione più semplice
Prima di tutto, puoi semplificare la tua funzione un bel po'. Questa funzione SQL più semplice fa lo stesso:
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;
Chiama:
select * from f_tree(15);
-
Potresti usa plpgsql, potrebbe essere leggermente utile per incassare il piano di query nelle versioni precedenti a PostgreSQL 9.2. Ma hai annullato l'unico vantaggio teorico utilizzando SQL dinamico senza necessità. Questo non ha per niente senso. Semplifica in semplice SQL.
-
Usa
UNION ALL
invece diUNION
, più economico poiché non ci possono essere duplicati in base alla progettazione.
Solo SQL
Ovviamente, puoi sostituirlo con un semplice 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;
Fa lo stesso.
VISUALIZZA
Ora, il VIEW
è una cosa banale:
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;
Il risultato non ha molto senso per me, ma la domanda non definisce nulla di più sensato..