Conforme mostrado em Usando expressões comuns de tabela no MSDN, você pode definir um CTE como:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
e use-o como:
SELECT <column_list> FROM expression_name;
Digamos que eu tenho 2 CTEs a seguir
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Uma consulta gera os mesmos resultados para os dois CTEs que a consulta interna é a mesma. A única diferença entre esses dois é que cte2 tem o nome da coluna ( (name)
) definido em sua declaração.
Quando executo os dois CTEs, não vejo diferença no plano de execução.
Estou apenas curioso para saber:
- Que diferença faz se eu não especificar nenhum nome de coluna na definição CTE?
- Por que devo / não devo especificar os nomes das colunas ao criar o CTE?
- Isso afeta o plano de execução da consulta por acaso? (Até onde eu vi, isso não faz nenhuma diferença.)