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:

  1. Consulta base: O conjunto inicial de linhas
  2. 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 RECURSIVE permite 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!