Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

333
Views
¿Cómo obtener una matriz de descendientes de las listas de adyacencia?

tengo la siguiente tabla y datos

 CREATE TABLE relationships (a TEXT, b TEXT); CREATE TABLE nodes(n TEXT); INSERT INTO relationships(a, b) VALUES ('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '6'), ('2', '7'), ('2', '8'), ('3', '9'); INSERT INTO nodes(n) VALUES ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10');

quiero salir

 n | children 1 | ['2', '3', '4', '5', '6', '7', '8', '9'] 2 | ['6', '7', '8', '9'] 3 | ['9'] 4 | [] 5 | [] 6 | [] 7 | [] 8 | [] 9 | [] 10 | []

Estoy tratando de usar WITH RECURSIVE pero no sé cómo pasar el parámetro a CTE

 WITH RECURSIVE traverse(n) AS ( SELECT * FROM relationships WHERE a = n --- not sure how to pass data to here UNION ALL ... ) WITH basic_cte AS ( SELECT a1.n as n, (SELECT COALESCE(json_agg(temp), '[]') FROM ( (SELECT * FROM traverse(a1.a)) ) as temp ) as children FROM nodes as a1 ) SELECT * FROM basic_cte;
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Nota: Esto ignora cualquier hijo vacío. Puede agregar una combinación izquierda como en la respuesta de @a_horse_with_no_name para obtener esa funcionalidad.

Realmente no puede pasar un parámetro al CTE a menos que se desvíe a los procedimientos almacenados y demás. El CTE es una sola tabla que debe contener todas las filas que desee usar.

Suponiendo un gráfico bastante bueno (sin bordes duplicados, sin ciclos), un código como el siguiente debería hacer lo que está buscando.

  • El caso base para la consulta recursiva obtiene todos los descendientes de nivel 1 (los hijos) para todos los nodos que posiblemente podrían ser padres.
  • El paso recursivo recorre el segundo nivel, el tercer nivel, etc. hacia abajo del árbol.
  • Una vez que tengamos todas las tuplas padre-descendiente, podemos agregar los datos como deseemos.
 WITH RECURSIVE descendants(parent, child) AS ( SELECT * FROM relationships UNION SELECT d.parent, rb FROM descendants d JOIN relationships r ON d.child=ra ) SELECT parent AS n, array_agg(child) AS children FROM descendants GROUP BY parent
over 4 years ago · Santiago Trujillo Report

0

Para obtener una lista de los hijos de todos los nodos, necesita una combinación izquierda en la tabla de nodos

 with recursive rels as ( select a,b, a as root from relationships union all select c.*, r.root from relationships c join rels r on rb = ca ) select nn, array_agg(rb) filter (where rb is not null) from nodes n left join rels r on r.root = nn group by nn order by nn;
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!