TECNOLOBO

No recuerdas tu codigo?
Se te olvido como se hace?

Aqui podras guardar lo que necesiten
Y cuando sea necesesario

Creado por julian gomez
iiiiii

Consulta recursivas



Descripcion

Usar common expression recursive

Nota


Para Comprenderlo con un ejemplo se crea una tabla de una estructura organizacional en una base de datos postgresSQL.

1. la idea es crear una consulta para traer los subordinados de un jefe.
						

Scrippt


-- This script only contains the table creation statements and does not fully represent the table in the database. It's still missing: indices, triggers. Do not use it as a backup.

-- Sequence and defined type
CREATE SEQUENCE IF NOT EXISTS empleados_id_seq;

-- Table Definition
CREATE TABLE "public"."empleados" (
    "id" int4 NOT NULL DEFAULT nextval('empleados_id_seq'::regclass),
    "nombre" varchar,
    "reportar_a" numeric
);

INSERT INTO "public"."empleados" ("id", "nombre", "reportar_a") VALUES
(1, 'Jefe Carlos', NULL);
INSERT INTO "public"."empleados" ("id", "nombre", "reportar_a") VALUES
(2, 'SubJefe Susana', 1);
INSERT INTO "public"."empleados" ("id", "nombre", "reportar_a") VALUES
(3, 'SubJefe Juan', 1);
INSERT INTO "public"."empleados" ("id", "nombre", "reportar_a") VALUES
(4, 'Gerente Pedero', 3),
(5, 'Gerente Melissa', 3),
(6, 'Gerente Carmen', 2),
(7, 'SubGerente Ramiro', 5),
(8, 'Programador Fernando', 7),
(9, 'Programador Eduardo', 7);
						

Plsql


--LA consulta recursiva lo que realiza es en "consulta recursiva" iniciar desde el registro id=3
-- luego continuar uno a uno hacia abajo, barriendo uno a uno con el join

WITH RECURSIVE bosses as (
	--inicio o datos de inicio
	select id , nombre, reportar_a from empleados 
	where id=3
	union
	--consulta recursiva
	select e.id, e.nombre, e.reportar_a from empleados e
	INNER join bosses on bosses.id = e.reportar_a
)
select * from bosses;

// Ejemplo basico de RECURSIVE
WITH RECURSIVE enumeracion as (
	--inicio o datos de inicio
	select 1 cantidad 
	union
	--consulta recursiva	
	select  cantidad + 1 from enumeracion where cantidad <10
)
select * from enumeracion;