PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रिकर्सिव फ़ंक्शन को देखने के लिए कनवर्ट करें

सरल कार्य

सबसे पहले, आप सरल कर सकते हैं आपका कार्य काफी कम है। यह सरल 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;

परिणाम मेरे लिए बहुत मायने नहीं रखता है, लेकिन प्रश्न अधिक समझदार कुछ भी परिभाषित नहीं करता है ..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2.ProgrammingError:रेडशिफ्ट से copy_from करने की कोशिश करते समय सिंटेक्स त्रुटि स्टडिन त्रुटि पर या उसके पास

  2. ओपनशिफ्ट टॉमकैट 7 कारतूस से पोस्टग्रेज कनेक्शन से इनकार कर दिया गया

  3. Postgresql में दशमलव मान Node.js में स्ट्रिंग के रूप में लौटा

  4. Php . में एकाधिक तालिकाओं के लिए क्वेरी लिखना

  5. क्या पोस्टग्रेज़ पोस्टग्रेएसक्यूएल का एक डिफ़ॉल्ट और विशेष उपयोगकर्ता है?