recusive ejemplo real

From: Carlos Beltran Villamizar <cbeltranv(at)cable(dot)net(dot)co>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: recusive ejemplo real
Date: 2011-01-26 02:42:27
Message-ID: 1296009747.1958.10.camel@carlos-MS-7135
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message JeNny C. Gamboa 2011-01-26 07:17:42 What''s going on?♁
Previous Message Alvaro Herrera 2011-01-25 21:02:33 Re: Consulta sobre custom_variable_classes