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.)
fonte
Curiosamente, prefiro nomear as colunas dentro da CTE em vez de dentro da cláusula
WITH CTE (xxx) AS
1 , pois você nunca inadvertidamente fará a correspondência entre os nomes e o conteúdo da coluna.Tomemos, por exemplo, o seguinte exemplo:
O que isso exibe? Ele mostra o conteúdo da
y
coluna sob o cabeçalho dex
e o conteúdo dax
coluna sob o cabeçalhoy
.Com essa realização, nunca especifico os nomes das colunas na
(xxx) AS
cláusula, mas faço assim:Isso remove todas as dúvidas sobre quais são as definições de coluna.
Em uma nota lateral totalmente não relacionada; sempre especifique o nome do esquema ao fazer referência a nomes de objetos e termine suas instruções com ponto e vírgula .
fonte
Por fim, cada coluna precisa de um nome válido e você pode atribuí-lo de duas maneiras:
Lista de colunas
Usando nomes ou aliases de coluna originais
Quando você faz alias e lista de colunas
Lista de colunas e aliases
Isso é semelhante à definição de uma Visualização ou Tabela Derivada, na qual você também pode especificar uma lista de nomes de colunas.
lista de colunas : quando você tem muitos cálculos complexos, é mais fácil identificar o nome, porque eles não estão espalhados pelo código-fonte. E é mais fácil se você tiver um cte recursivo e puder atribuir dois nomes diferentes para a mesma coluna no 3.
nome / aliases originais : você só precisa atribuir um alias se fizer um cálculo ou desejar / precisar renomear uma coluna
fonte
SomeAlias = SomeFunction(SomeColumn)
, com apenas uma definição de coluna por linha. Isso permite uma varredura simples no lado esquerdo da lista de colunas para localizar o que você está procurando.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Agora que você mencionou isso, estou pensando em cenários comoCREATE VIEW MyView (G) AS WITH cte (C) AS (SELECT A AS B FROM MyTable) SELECT E AS F FROM (SELECT C AS D FROM cte) AS s (E);
- que alegria em depurar isso seria!