Construir uma CTE Recursiva
Nesta etapa, você aprenderá como construir e usar uma Expressão de Tabela Comum (CTE - Common Table Expression) recursiva em SQLite. CTEs recursivos são usados para consultar dados hierárquicos ou em estrutura de árvore. Eles permitem que você percorra relacionamentos dentro de uma tabela e recupere dados em diferentes níveis da hierarquia.
Um CTE recursivo é um CTE que se refere a si mesmo. Ele consiste em duas partes:
- Membro Âncora (Anchor Member): A instrução
SELECT inicial que define o caso base ou ponto de partida da recursão.
- Membro Recursivo (Recursive Member): Uma instrução
SELECT que se refere ao próprio CTE. Esta parte executa a etapa recursiva, construindo sobre os resultados da iteração anterior.
O membro âncora e o membro recursivo são combinados usando o operador UNION ALL. A recursão continua até que o membro recursivo retorne um conjunto de resultados vazio.
Primeiro, vamos criar uma tabela chamada employees_hierarchy com a seguinte estrutura:
CREATE TABLE employees_hierarchy (
id INTEGER PRIMARY KEY,
name TEXT,
manager_id INTEGER,
title TEXT
);
Esta tabela representa a hierarquia de funcionários, onde manager_id se refere ao id do gerente do funcionário. Execute o comando acima no prompt sqlite>.
Em seguida, insira alguns dados de exemplo na tabela 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');
Aqui, Alice é a CEO (sem gerente), Bob e Charlie reportam-se a Alice, David reporta-se a Bob, Eve reporta-se a Charlie, Frank reporta-se a David e Grace reporta-se a Eve. Execute os comandos acima no prompt sqlite>.
Agora, vamos construir um CTE recursivo para recuperar toda a hierarquia sob Alice (a CEO). Execute a seguinte instrução 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 um CTE recursivo chamado EmployeeHierarchy. O membro âncora seleciona a CEO (onde manager_id é NULL). O membro recursivo junta a tabela employees_hierarchy com o CTE EmployeeHierarchy para encontrar funcionários que se reportam aos funcionários selecionados no nível anterior. A coluna level acompanha a profundidade na hierarquia.
Saída Esperada:
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
Isso mostra toda a hierarquia de funcionários, com o level indicando o nível de reporte.