Eenvoudigere functie
Allereerst kunt u vereenvoudigen je functie nogal. Deze eenvoudigere SQL-functie doet hetzelfde:
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;
Bel:
select * from f_tree(15);
-
Je zou gebruik plpgsql, misschien enigszins gunstig voor het verzilveren van het queryplan in versies vóór PostgreSQL 9.2. Maar je hebt het enige theoretische voordeel teniet gedaan door dynamische SQL zonder noodzaak te gebruiken. Dit heeft helemaal geen zin. Vereenvoudig naar gewone SQL.
-
Gebruik
UNION ALL
in plaats vanUNION
, goedkoper omdat er door het ontwerp geen dupes kunnen zijn.
Gewoon SQL
Uiteraard kunt u dit vervangen door gewone 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;
Doet hetzelfde.
WEERGAVE
Nu, de VIEW
is een triviale zaak:
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;
Het resultaat lijkt me niet zo logisch, maar de vraag definieert niets zinnigers ..