Enklare funktion
Först och främst kan du förenkla din funktion ganska mycket. Den här enklare SQL-funktionen gör samma sak:
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;
Ring:
select * from f_tree(15);
-
Du kunde använd plpgsql, kan vara lite fördelaktigt för att lösa in frågeplanen i versioner före PostgreSQL 9.2. Men du ogiltigförklarade den enda teoretiska fördelen genom att använda dynamisk SQL utan behov. Detta är ingen mening alls. Förenkla till vanlig SQL.
-
Använd
UNION ALL
istället förUNION
, billigare eftersom det inte kan finnas duper av design.
Bara SQL
Självklart kan du ersätta detta med vanlig 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;
Gör samma sak.
VISA
Nu, VIEW
är en trivial sak:
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;
Resultatet är inte så vettigt för mig, men frågan definierar inte något vettigare ..