I'm sure I'm missing something simple here, but I'm trying to use PostgreSQL's WITH RECURSIVE
to create a graph of children records.
The data (simplified) looks like this:
CREATE TABLE offspring (parent, children)
AS VALUES
( 'aaaaaaaa-8865-4b40-a482-78fc8a27d1bb'::uuid, '{ bbbbbbbb-8865-4b40-a482-78fc8a27d1bb, cccccccc-8865-4b40-a482-78fc8a27d1bb }'::uuid[] ),
( 'bbbbbbbb-8865-4b40-a482-78fc8a27d1bb'::uuid, '{ dddddddd-8865-4b40-a482-78fc8a27d1bb, eeeeeeee-8865-4b40-a482-78fc8a27d1bb }'::uuid[] ),
( 'cccccccc-8865-4b40-a482-78fc8a27d1bb'::uuid, '{ ffffffff-8865-4b40-a482-78fc8a27d1bb }'::uuid[] ),
( 'dddddddd-8865-4b40-a482-78fc8a27d1bb'::uuid, '{ 11111111-8865-4b40-a482-78fc8a27d1bb }'::uuid[] ),
( 'eeeeeeee-8865-4b40-a482-78fc8a27d1bb'::uuid, '{ 22222222-8865-4b40-a482-78fc8a27d1bb }'::uuid[] ),
( 'ffffffff-8865-4b40-a482-78fc8a27d1bb'::uuid, '{}'::uuid[] ),
( '11111111-8865-4b40-a482-78fc8a27d1bb'::uuid, '{}'::uuid[] ),
( '22222222-8865-4b40-a482-78fc8a27d1bb'::uuid, '{}'::uuid[] );
I've taken several stabs at it that I thought would work, but nothing has proven successful.
This simplified view reflects just the fields necessary to do the recursion, but when done, I'll also need to check timestamps on each record to filter appropriately, but I'm guessing I can handle that once the basic recursive query is in place.
My goal here is to end up with a single CTE that maps a single parent UUID to a UUID array of all of its children. Neither depth nor order are important in the resulting array.
Any help is appreciated.
-
are any childrens references by two parents?Evan Carroll– Evan Carroll2017年09月06日 18:23:23 +00:00Commented Sep 6, 2017 at 18:23
-
Thinking of this in graph terms, this is a digraph where the leaf nodes (final "children") will have 1:1 "parent" node, but every node that has a down-graph node can have n parents. So the question is: how does one select any node in the graph and navigate toward the leaf nodes, creating an array of all down-graph nodes in the process?Shane O.– Shane O.2017年09月07日 11:57:55 +00:00Commented Sep 7, 2017 at 11:57
1 Answer 1
Evidently, the answer required me to step away from it for a little bit.
Here's the query that solved my problem:
WITH RECURSIVE descendents AS (
SELECT parent,unnest(children) AS child
FROM offspring o
WHERE parent='aaaaaaaa-8865-4b40-a482-78fc8a27d1bb'
UNION ALL
SELECT o.parent,unnest(o.children) AS child
FROM offspring o, descendents d
WHERE o.parent = d.child)
SELECT distinct(child) FROM descendents;