Jump to content

Prefira usar CTE ao invés de subqueries


kassia.andrade

Postagens Recomendadas


Olá pessoal , tudo bem?

Vou falar um pouco sobre CTEs e seus benefícios para as boas práticas de documentação.

Oque é uma CTE? 
CTE é uma expressão de tabela comum, derivada de uma consulta simples. 

Sintaxe:
[ WITH <common_table_expression> [ ,...n ] ]  
  
<common_table_expression>::=  
    expression_name [ ( column_name [ ,...n ] ) ]  
    AS  
    ( CTE_query_definition )  
                
                
Porque usar CTE?
    
Visando as boas práticas para manutenção do código SQL, as CTEs são mais fáceis de ler 
por terem uma lógica de começo e fim melhor definida, desde que estejam devidamente indentadas. 
Facilitam o entendimento e debugação da query SQL.


Como usar as CTEs?

O ideal é sempre que usar uma CTE , a proxima corresponda a última CTE criada, desse jeito será bem fácil de identificar as
informações ao debugar a query.
Use sempre nomes que façam sentido para as CTEs , evite usar  s1, tb2 ..etc.., lembre-se quem
esta lendo seu código precisa entende-lo!
Se houver mais de uma CTE , a anterior deverá ser seguida de virgula antes de começar a próxima.

            
Exemplo de uso da CTE:

WITH vendas_cte AS  
-- Definição da primeira CTE
(  
    SELECT id_vendedor SUM(valor_total) AS valor_total_vendas, YEAR(adata) AS ano_vendas  
    FROM vendas.vendas_pedidos  
    WHERE id_vendedor IS NOT NULL  
       GROUP BY id_vendedor, YEAR(data)  
)  
,   
/*Use a virgula para separar uma CTE da outra  
Define a segunda query, onde não usamos mais o WITH , o WITH é utilizado apenas no começo.
A partir da segunda CTE utilizamos apenas o nome da CTE seguida de 'as'.
Essa CTE retorna dados de venda por ano e por pessoa  */

vendas_quota_cte   AS  
(  
       SELECT id_empresa, SUM(quota_vendas) AS quota_vendas, YEAR(data) AS quota_vendas_ano  
       FROM vendas.historico_quota_vendedor
       GROUP BY id_empresa, YEAR(data)  
)
  

--definição de query normal que utiliza as duas CTEs anteriores como tabela
SELECT id_vendedor  
  , ano_vendas  
  , FORMAT(valor_total_vendas,'C','en-us') AS total_vendas  
  , quota_vendas_ano  
  , FORMAT (quota_vendas, 'C' ,'en-us') AS quota_vendas  
  , FORMAT (valor_total_vendas -quota_vendas, 'C','en-us') AS acima_abaixo_quota
FROM vendas_cte  
JOIN vendas_quota_cte ON vendas_quota_cte.id_empresa = vendas_cte.id_vendedor  
AND vendas_cte.ano_vendas = vendas_quota_cte.quota_vendas_ano  
ORDER BY id_vendedor, ano_vendas;

 

 

Comaparação de CTE e subquery:

Exemplo de CTE:

with detalhes as (

    select
        id_usuario,
        nome,
        row_number() over (partition by id_usuario order by data_atualizacao desc) as rank_detalhe
    from billingdaddy.billing_stored_details

),

atualizacoes as (

    select 
        id_usuario
        nome
    from detalhes -- a segunda CTE chama a primeira CTE e assim por de ante
    where 
        rank_detalhe = 1

)

select * from atualizacoes


Exemplo de subquery:

Nesse exemplo existe apenas uma subquery, imagine várias subqueries como seria confuso de debugar.

select 
    id_usuario
    nome
from (
    select
        id_usuario,
        nome,
        row_number() over (partition by id_usuario order by data_atualizacao desc) as rank_detalhe
    from billingdaddy.billing_stored_details
) atualizacoes 
where 
    rank_detalhe = 1
                


Limitações da CTE:

Não suporta INSERT, UPDATE, DELETE e MERGE, apenas instrução SELECT.
Não é possível utilizar cláusula ORDER BY , exceto quando uma cláusula TOP é especificada.

 Concluindo ..não  é só no mundo do desenvolvimento que é necessário criar códigos legíveis e de fácil manutenção, no universo
 da analise de dados ,principalmente em scripts  SQL também existe essa necessidade. 
 Crie sempre sua query pensando no legado ,independentemente da linguagem 
 utilizada, lembre-se que sempre terá alguém que precisará ler e entender seu código.

  • Curtir 2
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora
×
×
  • Create New...