Construir un CTE Recursivo
En este paso, aprenderás cómo construir y usar una Expresión de Tabla Común (CTE, Common Table Expression) recursiva en SQLite. Los CTEs recursivos se utilizan para consultar datos jerárquicos o con estructura de árbol. Te permiten recorrer las relaciones dentro de una tabla y recuperar datos en diferentes niveles de la jerarquía.
Un CTE recursivo es un CTE que se refiere a sí mismo. Consta de dos partes:
- Miembro Ancla (Anchor Member): La declaración
SELECT
inicial que define el caso base o el punto de partida de la recursión.
- Miembro Recursivo (Recursive Member): Una declaración
SELECT
que se refiere al propio CTE. Esta parte realiza el paso recursivo, basándose en los resultados de la iteración anterior.
El miembro ancla y el miembro recursivo se combinan utilizando el operador UNION ALL
. La recursión continúa hasta que el miembro recursivo devuelve un conjunto de resultados vacío.
Primero, vamos a crear una tabla llamada employees_hierarchy
(jerarquía_empleados) con la siguiente estructura:
CREATE TABLE employees_hierarchy (
id INTEGER PRIMARY KEY,
name TEXT,
manager_id INTEGER,
title TEXT
);
Esta tabla representa la jerarquía de empleados, donde manager_id
se refiere al id
del gerente del empleado. Ejecuta el comando anterior en el prompt sqlite>
.
A continuación, inserta algunos datos de ejemplo en la tabla employees_hierarchy
:
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Alice', NULL, 'CEO');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Bob', 1, 'VP of Marketing');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Charlie', 1, 'VP of Sales');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('David', 2, 'Marketing Manager');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Eve', 3, 'Sales Manager');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Frank', 4, 'Marketing Specialist');
INSERT INTO employees_hierarchy (name, manager_id, title) VALUES ('Grace', 5, 'Sales Representative');
Aquí, Alice es la CEO (sin gerente), Bob y Charlie reportan a Alice, David reporta a Bob, Eve reporta a Charlie, Frank reporta a David y Grace reporta a Eve. Ejecuta los comandos anteriores en el prompt sqlite>
.
Ahora, vamos a construir un CTE recursivo para recuperar toda la jerarquía bajo Alice (la CEO). Ejecuta la siguiente declaración SQL:
WITH RECURSIVE
EmployeeHierarchy(id, name, manager_id, title, level) AS (
-- Anchor member: Select the CEO
SELECT id, name, manager_id, title, 0 AS level
FROM employees_hierarchy
WHERE manager_id IS NULL
UNION ALL
-- Recursive member: Select employees reporting to the current level
SELECT e.id, e.name, e.manager_id, e.title, eh.level + 1
FROM employees_hierarchy e
JOIN EmployeeHierarchy eh ON e.manager_id = eh.id
)
SELECT id, name, title, level
FROM EmployeeHierarchy;
Esta consulta define un CTE recursivo llamado EmployeeHierarchy
(JerarquíaEmpleados). El miembro ancla selecciona a la CEO (donde manager_id
es NULL). El miembro recursivo une la tabla employees_hierarchy
con el CTE EmployeeHierarchy
para encontrar empleados que reportan a los empleados seleccionados en el nivel anterior. La columna level
(nivel) realiza un seguimiento de la profundidad en la jerarquía.
Resultado Esperado:
1|Alice|CEO|0
2|Bob|VP of Marketing|1
3|Charlie|VP of Sales|1
4|David|Marketing Manager|2
5|Eve|Sales Manager|2
6|Frank|Marketing Specialist|3
7|Grace|Sales Representative|3
Esto muestra toda la jerarquía de empleados, con el level
(nivel) indicando el nivel de reporte.