मुझे यह मिल गया है, इसे किसी भी प्रकार के डेटा के साथ अनंत लूप में नहीं जाना चाहिए:
--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() का उपयोग करके इस पहेली को हल किया।