Database
 sql >> Base de Dados >  >> RDS >> Database

Expressões de tabela comuns:quando e como usá-las

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