Diseños recursivos, como los de este ejemplo, son muy útiles en proyectos con temas organizacionales o contables. Sin embargo su manejo es de cuidado. Afortunadamente con <recursive> se pueden preparar muchos informes con su estructura jerárquica así:
---- CREATE TABLE lineanegocio ( id serial, PRIMARY KEY (id), nombre character varying (100) NOT NULL, orden integer NOT NULL, lineanegocio_id int, FOREIGN KEY (lineanegocio_id) REFERENCES lineanegocio(id), activ boolean DEFAULT true ); --1 INSERT INTO lineanegocio (nombre, orden) VALUES ('FINCAS', 1); --2 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('AGRICOLA',1, 1); --3 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('PECUARIA',2, 1); --4 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('MANGOS', 1, 2); --5 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('CITRICOS', 2, 2); --6 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('AVES DE CORRAL',1, 3); --7 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('MANGO TOMMY', 1, 4); --8 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('MANGO COMUN', 2, 4); --9 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('NARANJA', 1, 5); --10 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('LIMON', 2, 5); --11 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('CARNE POLLO', 1, 6); --12 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('POLLO VIVO', 2, 6); --13 INSERT INTO lineanegocio (nombre, orden, lineanegocio_id) VALUES ('HUEVOS', 3, 6); --14 INSERT INTO lineanegocio (nombre, orden) VALUES ('SUPERMERCADOS', 2); -- ... WITH RECURSIVE lineasnegocio (nivel, id, nombre, lineanegocio_id, camino) AS ( SELECT 0, padre.id, padre.nombre, padre.lineanegocio_id, padre.orden::text || padre.nombre::text FROM lineanegocio AS padre WHERE padre.lineanegocio_id IS NULL UNION ALL SELECT padre.nivel + 1, hijo.id, hijo.nombre, hijo.lineanegocio_id, padre.camino || '.' || hijo.orden::text || hijo.nombre FROM lineasnegocio padre JOIN lineanegocio AS hijo ON hijo.lineanegocio_id = padre.id ) SELECT rpad('', nivel * 2, '_') || nombre AS nombre_unidad_negocio, id FROM lineasnegocio ORDER BY camino; ---- Compañeros de lista. Espero les sirva. Desde Bogotá. Colombia. Carlos Beltrán Villamizar. - Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda