Cláusula SQL WITH: Expressões de Tabela Comuns (CTE) e Consultas Recursivas
Published: 2026-02-04
A cláusula WITH (também chamada de Common Table Expression ou CTE) permite definir conjuntos de resultados temporários nomeados que você pode referenciar em uma consulta. Isso torna consultas complexas mais legíveis e reutilizáveis. Ela está disponível na maioria dos bancos de dados SQL modernos, incluindo SQLite, PostgreSQL, MySQL 8.0+, SQL Server e Oracle.
Dados de Exemplo
Usamos duas tabelas em todos os exemplos:
Tabela employees:
| id | name | manager_id | salary |
|---|---|---|---|
| 1 | Alice | NULL | 120000 |
| 2 | Bob | 1 | 80000 |
| 3 | Carol | 1 | 85000 |
| 4 | Dave | 2 | 60000 |
| 5 | Eve | 2 | 62000 |
| 6 | Frank | 3 | 58000 |
Tabela sales:
| id | employee_id | amount | month |
|---|---|---|---|
| 1 | 2 | 5000 | January |
| 2 | 2 | 6000 | February |
| 3 | 3 | 7000 | January |
| 4 | 3 | 8000 | February |
| 5 | 4 | 3000 | January |
| 6 | 5 | 4000 | January |
| 7 | 6 | 2500 | February |
Cláusula WITH Básica (Não Recursiva)
Uma cláusula WITH define uma ou mais tabelas temporárias nomeadas que existem apenas durante a execução da consulta.
Exemplo: Vendas Totais por Funcionário
A CTE employee_sales calcula o total de vendas por funcionário e, em seguida, fazemos um join com a tabela employees para mostrar os nomes.
Múltiplas CTEs
Você pode definir múltiplas CTEs separadas por vírgulas. CTEs posteriores podem referenciar CTEs anteriores.
Exemplo: Análise de Vendas com Múltiplas Métricas
WITH RECURSIVE: Percorrendo Hierarquias
WITH RECURSIVE permite que uma CTE referencie a si mesma, possibilitando percorrer dados hierárquicos ou em forma de árvore. Isso é útil para organogramas, hierarquias de categorias ou qualquer relacionamento pai‑filho.
Uma CTE recursiva tem duas partes:
- Consulta base: O conjunto inicial de linhas
- Consulta recursiva: Faz referência à própria CTE para encontrar linhas relacionadas
Exemplo: Organograma (Todos os Funcionários sob um Gerente)
Encontre todos os funcionários sob Alice (a CEO):
Exemplo: Cadeia de Comando (Encontrar a Hierarquia de Gerentes)
Encontre a cadeia completa de comando de Dave (que se reporta a Bob, que se reporta a Alice):
Sintaxe de WITH RECURSIVE em Diferentes Bancos de Dados
WITH RECURSIVE é suportado em:
- SQLite — 3.8.3+ (2013)
- PostgreSQL — 8.4+ (2009)
- SQL Server — 2005+ (chamado de “Recursive CTE”)
- Oracle — 11g+ (chamado de “Recursive Subquery Factoring”)
- MySQL — 8.0+ (2018)
Observação: Versões mais antigas do MySQL e alguns outros bancos de dados não suportam CTEs recursivas — eles podem exigir abordagens diferentes, como procedures armazenadas ou recursão na camada da aplicação.
Casos de Uso Comuns para Cláusulas WITH
- Simplificar consultas complexas — Quebrar uma consulta grande em etapas lógicas
- Reutilizar subconsultas — Definir um cálculo uma vez e usá‑lo várias vezes
- Percorrer hierarquias — Navegar em árvores (organogramas, categorias, comentários)
- Gerar sequências — Criar faixas de números ou faixas de datas
- Agregações progressivas — Construir resultados em etapas
Resumo
WITH(CTE) cria um conjunto de resultados temporário nomeado para uso em uma consulta- Múltiplas CTEs podem ser encadeadas
WITH RECURSIVEpermite que uma CTE referencie a si mesma para consultas hierárquicas- CTEs recursivas exigem um caso base e um caso recursivo separados por
UNION ALL - Suportado em todos os bancos de dados SQL modernos (embora a sintaxe possa variar ligeiramente)
Tente modificar os exemplos acima para explorar diferentes hierarquias ou cálculos!