Fungsi yang lebih sederhana
Pertama-tama, Anda dapat menyederhanakan fungsi Anda cukup sedikit. Fungsi SQL yang lebih sederhana ini melakukan hal yang sama:
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;
Telepon:
select * from f_tree(15);
-
Anda bisa gunakan plpgsql, mungkin sedikit bermanfaat untuk menguangkan paket kueri dalam versi sebelum PostgreSQL 9.2. Tetapi Anda membatalkan satu-satunya manfaat teoretis dengan menggunakan SQL dinamis tanpa perlu. Ini tidak masuk akal sama sekali. Sederhanakan ke SQL biasa.
-
Gunakan
UNION ALL
bukannyaUNION
, lebih murah karena desainnya tidak boleh ditipu.
Hanya SQL
Jelas, Anda dapat mengganti ini dengan SQL biasa:
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;
Melakukan hal yang sama.
LIHAT
Sekarang, VIEW
adalah masalah sepele:
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;
Hasilnya tidak masuk akal bagi saya, tetapi pertanyaannya tidak mendefinisikan sesuatu yang lebih masuk akal ..