Como se muestra en Uso de expresiones de tabla comunes en MSDN, puede definir un CTE como:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
y úsalo como:
SELECT <column_list> FROM expression_name;
Digamos que tengo los siguientes 2 CTE
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Una consulta genera los mismos resultados para ambos CTE que la consulta interna es la misma. La única diferencia entre estos dos es que cte2 tiene el nombre de columna ( (name)
) definido en su declaración.
Cuando ejecuto ambos CTE, no veo ninguna diferencia en el plan de ejecución.
Tengo curiosidad por saber:
- ¿Qué diferencia hay si no especifico ningún nombre de columna en la definición de CTE?
- ¿Por qué debería / no debería especificar nombres de columna al crear CTE?
- ¿Afecta el plan de ejecución de consultas por casualidad? (Por lo que he visto, no hace ninguna diferencia).
fuente
Como anécdota, prefiero nombrar las columnas dentro del CTE en lugar de dentro de la cláusula
WITH CTE (xxx) AS
1, ya que nunca desajustarás los nombres con el contenido de la columna.Tomemos por ejemplo el siguiente ejemplo:
¿Qué muestra esto? Muestra el contenido de la
y
columna debajo del encabezadox
y el contenido de lax
columna debajo del encabezadoy
.Con esta realización, nunca especifico los nombres de columna en la
(xxx) AS
cláusula, sino que lo hago así:Esto elimina toda duda sobre cuáles son las definiciones de columna.
En una nota al margen totalmente no relacionada; siempre especifique el nombre del esquema cuando haga referencia a nombres de objetos y finalice sus declaraciones con un punto y coma .
fuente
Finalmente, cada columna necesita un nombre válido y puede asignarlo de dos maneras:
Lista de columnas
Usar nombres de columna o alias originales
Cuando haces tanto el alias como la lista de columnas
Lista de columnas y alias
Esto es similar a la definición de una Vista o una Tabla derivada, donde también puede especificar una lista de nombres de columna.
lista de columnas : cuando tiene muchos cálculos complejos, es más fácil detectar el nombre, ya que no están dispersos en el código fuente. Y es más fácil si tienes un cte recursivo y puedes asignar dos nombres diferentes para la misma columna en el n. ° 3.
nombre / alias originales : solo debe asignar un alias si realiza un cálculo o desea / debe cambiar el nombre de una columna
fuente
SomeAlias = SomeFunction(SomeColumn)
, con solo una definición de columna por línea. Esto permite un escaneo simple en el lado izquierdo de la lista de columnas para localizar el que está buscando.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Ahora que lo mencionó, estoy pensando en escenarios 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);
: ¡qué alegría sería depurar eso!