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

एक संपूर्ण अप्रत्यक्ष ग्राफ़ को ट्रेस करने और सभी किनारों को वापस करने के लिए PostgreSQL SQL क्वेरी

मुझे यह मिल गया है, इसे किसी भी प्रकार के डेटा के साथ अनंत लूप में नहीं जाना चाहिए:

--create temp table edges ("from" text, "to" text);
--insert into edges values ('initial_node', 'a'), ('a', 'b'), ('a', 'c'), ('c', 'd');

with recursive graph(points) as (
  select array(select distinct "to" from edges where "from" = 'initial_node')
  union all
  select g.points || e1.p || e2.p
  from graph g
  left join lateral (
    select array(
      select distinct "to"
      from edges 
      where "from" =any(g.points) and "to" <>all(g.points) and "to" <> 'initial_node') AS p) e1 on (true)
  left join lateral (
    select array(
      select distinct "from"
      from edges 
      where "to" =any(g.points) and "from" <>all(g.points) and "from" <> 'initial_node') AS p) e2 on (true)
  where e1.p <> '{}' OR e2.p <> '{}'
  )
select distinct unnest(points)
from graph
order by 1

क्या चुना जा सकता है के संदर्भ में पुनरावर्ती प्रश्न बहुत सीमित हैं, और चूंकि वे उप-चयन के अंदर पुनरावर्ती परिणामों का उपयोग करने की अनुमति नहीं देते हैं, इसलिए कोई भी उपयोग नहीं कर सकता है (पुनरावर्ती से चुनें * जहां ...)। परिणामों को एक सरणी में संग्रहीत करना, लेफ्ट जॉइन लेटरल का उपयोग करना और =ANY() और <>ALL() का उपयोग करके इस पहेली को हल किया।




  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. Django मॉडल में ट्रिग्राम (gin_trgm_ops) के साथ एक जिन इंडेक्स बनाना

  3. पोस्टग्रेज में अंतिम सम्मिलित सीरियल आईडी चुनें/प्रदर्शित करें

  4. JSON सरणी डेटा फ़ील्ड के भीतर डेटा क्वेरी करना

  5. क्वेरी में सम्मिलित JSON(B) कॉलम को मर्ज करना