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

PostgreSQL पुनरावर्ती CTE से फ़ंक्शन पर डेटा पास करता है

यदि आप नीचे से शुरू करते हैं तो आप पथ की खोज को और अधिक कुशल बना सकते हैं। बच्चों से शुरू करें। यदि आप माता-पिता से शुरू करते हैं, तो इसमें सभी बच्चों को पार करना शामिल है; जबकि यदि आपने बच्चे से खोजा है, तो उसके पास केवल एक माता-पिता है, इसलिए स्रोत और लक्ष्य के बीच का रास्ता खोजने में समय बर्बाद नहीं करेगा।

with recursive find_parent(source, target, recentness) as
(
    select source, target, 0 
    from tbl
    where target = 9

    union all

    select i.source, i.target, fp.recentness + 1
    from tbl i
    join find_parent fp on i.target = fp.source
),
construct_path(source, target, recentness, path) as
(
  select source, target, recentness, source || '.' || target
  from find_parent 
  where recentness = (select max(recentness) from find_parent)

  union

  select dd.source, dd.target, dd.recentness, cp.path || '.' || dd.target
  from find_parent dd
  join construct_path cp on dd.recentness = cp.recentness - 1  
)
select source, target, path 
from construct_path
order by recentness desc

आउटपुट:

SOURCE   TARGET   PATH
1        2        1.2
2        4        1.2.4
4        9        1.2.4.9

लाइव परीक्षण:http://www.sqlfiddle.com/#!1/13e6b/1

इसी तरह:SQL सर्वर 2005 में माता-पिता को बच्चे को कैसे प्राप्त करें

यह अनुकूलित है, माता-पिता को रिकर्सन काट लें यदि यह पहले से ही विशिष्ट एक (स्रोत) ढूंढता है।

स्रोत =2

लक्ष्य =9

with recursive find_parent(source, target, recentness) as
(
    select source, target, 0 
    from tbl
    where target = 9

    union all

    select i.source, i.target, fp.recentness + 1
    from tbl i
    join find_parent fp on i.target = fp.source 
         -- despite the name, this target is another one's source
         and i.target <> 2
)
,construct_path(source, target, recentness, path) as
(
    select source, target, recentness, source || '.' || target
    from find_parent 
    where recentness = (select max(recentness) from find_parent)

    union

    select dd.source, dd.target, dd.recentness, cp.path || '.' || dd.target
    from find_parent dd
    join construct_path cp on dd.recentness = cp.recentness - 1  

)
select source, target, path
from construct_path
order by recentness desc

आउटपुट:

SOURCE   TARGET  PATH
2        4       2.4
4        9       2.4.9

लाइव परीक्षण:http://www.sqlfiddle.com/#!1/13e6b/16



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज:एक उपयोगकर्ता को सुपरयुसर बनने के लिए अपग्रेड करें?

  2. पोस्टग्रेज डीबी फाइलें - कौन सी फाइल विशिष्ट टेबल/इंडेक्स का प्रतिनिधित्व करती है?

  3. लूप के लिए पोस्टग्रेज

  4. PostgreSQL 11:विभाजन पैच के लिए पैच समीक्षक

  5. PL/pgSQL फ़ंक्शन में वैकल्पिक तर्क