JuanCri.com

jueves 11 de febrero, 2010 a las 23:00

Cuando se llevan estructuras de árbol a una base de datos, es común utilizar un esquema como este:

CREATE TABLE nodos
(
    id int primary key,
    idpadre integer REFERENCES nodos (id),
    nombre varchar
);

Una vez hecho esto, podemos insertar algunos datos para crear la estructura:

INSERT INTO nodos (id, nombre) VALUES (1, 'Raíz');
INSERT INTO nodos (id, nombre, idpadre) VALUES (2, 'Nodo 1', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (3, 'Nodo 2', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (4, 'Nodo 3', 2);
INSERT INTO nodos (id, nombre, idpadre) VALUES (5, 'Nodo 4', 4);

Con estos datos, tendremos una estructura como esta:

Raíz (1)
 |-- Nodo 1 (2)
 |    |-- Nodo 3 (4)
 |         |-- Nodo 4 (5)
 |-- Nodo 2 (3)

Supongamos que queremos saber todos los nodos padres del "Nodo 4" (ID: 5). Para esto, PostgreSQL provee consultas recursivas. Acá un ejemplo de cómo podemos realizar la consulta para este nodo:

WITH RECURSIVE arbol (idpadre, idnodo) AS (
    SELECT
	n.idpadre,
	n.id
    FROM
	nodos n
    WHERE
	n.id = 5
  UNION ALL
    SELECT n2.idpadre, n2.id
    FROM arbol a INNER JOIN nodos n2
      ON (n2.id = a.idpadre)
  )
SELECT * FROM arbol

Esta simple consulta, retornará:

 idpadre | idnodo 
---------+--------
       4 |      5
       2 |      4
       1 |      2
         |      1

Espero que les sirva ;)

Creative Commons License
Blog JuanCri.com por Juan Cristóbal Olivares licenciado bajo la Creative Commons Attribution 2.0 Chile License.
Mono PostgreSQL Firefox Gratis

© JuanCri.com