Jednodušší funkce
V první řadě můžete zjednodušit vaše funkce docela dost. Tato jednodušší funkce SQL dělá totéž:
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;
Volejte:
select * from f_tree(15);
-
Mohli byste použijte plpgsql, může být mírně užitečné pro zpeněžování plánu dotazů ve verzích před PostgreSQL 9.2. Ale vy jste zrušili jedinou teoretickou výhodu použitím dynamického SQL bez potřeby. To nedává vůbec smysl. Zjednodušte na prostý SQL.
-
Použijte
UNION ALL
místoUNION
, levnější, protože nemohou být podvody podle návrhu.
Jen SQL
Samozřejmě to můžete nahradit obyčejným 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;
Dělá to samé.
ZOBRAZIT
Nyní VIEW
je triviální záležitost:
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;
Výsledek mi moc nedává smysl, ale otázka nedefinuje nic rozumnějšího..