CTE no crean nada 'real'. Son simplemente un elemento de lenguaje, una forma de expresar una expresión de tabla que se utilizará, posiblemente repetidamente, en una declaración. Cuando usted dice
WITH cteFoo AS (select ... from table where ...)
select ... from cteFoo where ...
es sólo otra forma de decir
select ... from (select ... from table where ....) as cteFoo where ...
CTE y tablas derivadas son muy similares, cualquier consulta utilizando tablas derivadas puede ser regrabadas como CTE, y cualquier CTE no recursivo CAN ser reescrito como una consulta usando tablas derivadas. Personalmente, prefiero mucho más el formulario CTE porque es más conciso y fácil de leer.
CTEs permiten una expresión de tabla utilizar varias veces para ser declarar sólo una vez:
WITH cte AS (select ... from table where ...)
select ...
from cte a join cte b on ...
where ...
comparar esto con la forma tabla derivada semánticamente similar:
select ...
from (
select ... from table where ...) as a
join (
select ... from table where ...) as b
on ...
where ...
El CTE es claramente más legible. Pero debe comprender que las dos formas están produciendo la misma consulta. El formulario CTE podría sugerir que se crea un resultado intermedio, luego la unión se ejecuta en el resultado intermedio, pero esto no es cierto. El formulario CTE se compila en exactamente la misma forma que la tabla derivada uno, lo que deja en claro el hecho de que la expresión de tabla del CTE se ejecuta dos veces.
Este es un buen ejemplo de por qué todos deberíamos usar punto y coma en nuestro T-SQL. Tener ';' colocado correctamente después de las instrucciones UPDATE y DELETE deja en claro que el CTE es _parte de_ la instrucción UPDATE. – NReilingh