2010-05-18 14 views
6

Tengo una tabla de estructura de árbol con columnas: id, principal, nombre. Dado un árbol A-> B-> C, ¿cómo podría obtener la máxima ID de padre A según la ID de C? ¿Especialmente cómo escribir SQL con "con recursivo"? Gracias!Cómo obtener el padre más superior en PostgreSQL

Respuesta

4

Para implementar consultas recursivas, necesita un Common Table Expression (CTE). Esta consulta calcula ancestros de todos los nodos principales. Como solo queremos el nivel superior, seleccionamos donde level = 0.

WITH RECURSIVE Ancestors AS 
(
    SELECT id, parent, 0 AS level FROM YourTable WHERE parent IS NULL 
    UNION ALL 
    SELECT child.id, child.parent, level+1 FROM YourTable child INNER JOIN 
     Ancestors p ON p.id=child.parent 

) 
SELECT * FROM Ancestors WHERE a.level=0 AND a.id=C 

Si desea recuperar todos sus datos, utilice una unión interna en el ID, p.

SELECT YourTable.* FROM Ancestors a WHERE a.level=0 AND a.id=C 
    INNER JOIN YourTable ON YourTable.id = a.id 
+0

creo que esto sólo el padre inmediato y el nivel. He pegado los resultados de esta consulta en http://pastebin.com/epjG28YW –

1
WITH RECURSIVE q AS 
     (
     SELECT m 
     FROM mytable m 
     WHERE id = 'C' 
     UNION ALL 
     SELECT m 
     FROM q 
     JOIN mytable m 
     ON  m.id = q.parent 
     ) 
SELECT (m).* 
FROM q 
WHERE (m).parent IS NULL 
Cuestiones relacionadas