सरल कार्य
सबसे पहले, आप सरल कर सकते हैं आपका कार्य काफी कम है। यह सरल SQL फ़ंक्शन वही करता है:
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;
कॉल करें:
select * from f_tree(15);
-
आप कर सकते थे plpgsql का उपयोग करें, हो सकता है थोड़ा PostgreSQL 9.2 से पहले के संस्करणों में क्वेरी योजना को भुनाने के लिए फायदेमंद है। लेकिन आपने बिना आवश्यकता के गतिशील SQL का उपयोग करके एकमात्र सैद्धांतिक लाभ को शून्य कर दिया। यह बिलकुल अर्थहीन प्रतीत होता है। सादा SQL में सरल करें।
-
UNION ALL
का उपयोग करेंUNION
. के बजाय , सस्ता है क्योंकि डिज़ाइन के अनुसार धोखा नहीं हो सकता है।
बस SQL
जाहिर है, आप इसे सादे 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;
वही करता है।
देखें
अब, VIEW
मामूली बात है:
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;
परिणाम मेरे लिए बहुत मायने नहीं रखता है, लेकिन प्रश्न अधिक समझदार कुछ भी परिभाषित नहीं करता है ..