Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group