09 Subconsultas e CTE - rodrigomourapinto/aprenda_postgresql GitHub Wiki

Subconsultas e CTEs

Subconsulta é uma consulta usada dentro de outra. CTE (WITH) é uma forma de nomear uma consulta intermediária dentro de uma instrução.

Subconsulta escalar

SELECT
    nome,
    preco,
    (SELECT AVG(preco) FROM produtos) AS media_geral
FROM produtos;

EXISTS

SELECT c.nome
FROM clientes c
WHERE EXISTS (
    SELECT 1
    FROM pedidos p
    WHERE p.cliente_id = c.cliente_id
);

CTE para leitura

WITH vendas_por_cliente AS (
    SELECT cliente_id, SUM(total) AS faturamento
    FROM pedidos
    GROUP BY cliente_id
)
SELECT c.nome, v.faturamento
FROM clientes c
JOIN vendas_por_cliente v
  ON v.cliente_id = c.cliente_id
ORDER BY v.faturamento DESC;

CTE recursiva

Útil para hierarquias. Exemplo genérico:

WITH RECURSIVE arvore AS (
    SELECT id, nome, parent_id, 0 AS nivel
    FROM categorias_hierarquicas
    WHERE parent_id IS NULL

    UNION ALL

    SELECT c.id, c.nome, c.parent_id, a.nivel + 1
    FROM categorias_hierarquicas c
    JOIN arvore a ON a.id = c.parent_id
)
SELECT *
FROM arvore
ORDER BY nivel, id;