Categorias
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;