O que são expressões de tabela comuns (CTEs)?
Uma expressão de tabela comum (CTE) é o conjunto de resultados de uma consulta que existe temporariamente e para uso apenas no contexto de uma consulta maior. Assim como uma tabela derivada, o resultado de uma CTE não é armazenado e existe apenas durante a consulta. Este artigo se concentrará em CTEs não recursivos.
Como os CTEs são úteis?
CTEs, como exibições de banco de dados e tabelas derivadas, permitem que os usuários escrevam e mantenham consultas complexas com mais facilidade por meio de maior legibilidade e simplificação. Essa redução na complexidade é alcançada pela desconstrução de consultas normalmente complexas em blocos simples para serem usados e reutilizados, se necessário, na reescrita da consulta. Exemplos de casos de uso incluem:
- Precisar fazer referência a uma tabela derivada várias vezes em uma única consulta
- Uma alternativa para criar uma visualização no banco de dados
- Realizar o mesmo cálculo várias vezes em vários componentes de consulta
Como criar um CTE
- Iniciar um CTE usando "COM"
- Forneça um nome para a consulta de resultado a ser definida em breve
- Depois de atribuir um nome, siga com "AS"
- Especifique os nomes das colunas (etapa opcional)
- Defina a consulta para produzir o conjunto de resultados desejado
- Se vários CTEs forem necessários, inicie cada expressão subsequente com uma vírgula e repita as etapas 2 a 4.
- Faça referência aos CTEs definidos acima em uma consulta subsequente
Sintaxe
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
##Exemplo CTEA consulta a seguir responde à pergunta de negócios:“qual é o custo médio mensal por campanha para os esforços de marketing da empresa?” Isso pode ser feito com uma consulta derivada (mostrada abaixo); no entanto, o uso de um CTE melhora a legibilidade
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
Usando uma consulta derivada:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
Documentação
- Postgre
- Desvio para o vermelho
- Oráculo
- SQLServer