He comenzado a leer sobre la expresión de tabla común y no puedo pensar en un caso de uso en el que deba usarlos. Parecen ser redundantes ya que lo mismo se puede hacer con tablas derivadas. ¿Hay algo que me falta o que no entiendo bien? ¿Alguien puede darme un ejemplo simple de limitaciones con consultas regulares de selección, derivada o tabla temporal para exponer el caso de CTE? Cualquier ejemplo simple sería muy apreciado.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Los uso para dividir consultas complejas, especialmente combinaciones complejas y subconsultas. Encuentro que los estoy usando cada vez más como 'pseudo-vistas' para ayudarme a entender la intención de la consulta.
Mi única queja sobre ellos es que no se pueden reutilizar. Por ejemplo, puedo tener un proceso almacenado con dos declaraciones de actualización que podrían usar el mismo CTE. Pero el 'alcance' del CTE es solo la primera consulta.
¡El problema es que los 'ejemplos simples' probablemente no necesiten CTE!
Aún así, muy útil.
fuente
VIEW
:) :) un díaHay dos razones por las que veo usar cte's.
Usar un valor calculado en la cláusula where. Esto me parece un poco más limpio que una tabla derivada.
Supongamos que hay dos tablas: preguntas y respuestas unidas por Questions.ID = Answers.Question_Id (e id. Del cuestionario)
Aquí hay otro ejemplo donde quiero obtener una lista de preguntas y respuestas. Quiero que las respuestas se agrupen con las preguntas en los resultados.
fuente
HAVING
es otra forma de hacer un filtro de etapa tardía que puede ser similar a usar un sub-SELECT
Uno de los escenarios que encontré útiles para usar CTE es cuando desea obtener DISTINCT filas de datos basadas en una o más columnas, pero devuelve todas las columnas de la tabla. Con una consulta estándar, es posible que primero tenga que volcar los valores distintos en una tabla temporal y luego intente unirlos nuevamente a la tabla original para recuperar el resto de las columnas o puede escribir una consulta de partición extremadamente compleja que pueda devolver los resultados en una carrera, pero lo más probable es que sea ilegible y cause problemas de rendimiento.
Sin embargo, usando CTE (como respondida por Tim Schmelter en Seleccionar la primera instancia de un registro )
Como puede ver, esto es mucho más fácil de leer y mantener. Y en comparación con otras consultas, es mucho mejor en rendimiento.
fuente
Quizás sea más significativo pensar en un CTE como un sustituto de una vista utilizada para una sola consulta. Pero no requiere la sobrecarga, los metadatos o la persistencia de una vista formal. Muy útil cuando necesitas:
Aquí hay un ejemplo de cortar y pegar para jugar:
Disfrutar
fuente
Hoy vamos a aprender sobre la expresión de tabla común que es una nueva característica que se introdujo en SQL Server 2005 y también está disponible en versiones posteriores.
Expresión de tabla común: la expresión de tabla común se puede definir como un conjunto de resultados temporal o, en otras palabras, es un sustituto de las vistas en SQL Server. La expresión de tabla común solo es válida en el lote de instrucciones donde se definió y no se puede usar en otras sesiones.
Sintaxis de declarar CTE (expresión de tabla común): -
Tomemos un ejemplo: -
He creado dos tablas de empleado y Departamento e inserté 5 filas en cada tabla. Ahora me gustaría unirme a estas tablas y crear un conjunto de resultados temporal para usarlo más.
Tomemos cada línea de la declaración una por una y comprendamos.
Para definir CTE escribimos la cláusula "con", luego le damos un nombre a la expresión de la tabla, aquí he dado el nombre como "CTE_Example"
Luego escribimos "As" y encerramos nuestro código entre dos corchetes (---), podemos unir varias tablas en los corchetes adjuntos.
En la última línea, he usado "Seleccionar * de CTE_Example", estamos refiriendo la expresión de tabla común en la última línea de código, por lo que podemos decir que es como una vista, donde estamos definiendo y usando la vista en una sola batch y CTE no se almacenan en la base de datos como un objeto permanente. Pero se comporta como una vista. podemos realizar una declaración de eliminación y actualización en CTE y eso tendrá un impacto directo en la tabla referenciada que se está utilizando en CTE. Tomemos un ejemplo para entender este hecho.
En la declaración anterior, estamos eliminando una fila de CTE_Example y eliminará los datos de la tabla de referencia "DEPT" que se está utilizando en el CTE.
fuente
Es muy útil cuando desea realizar una "actualización ordenada".
MS SQL no le permite usar ORDER BY con UPDATE, pero con la ayuda de CTE puede hacerlo de esa manera:
Mire aquí para obtener más información: Cómo actualizar y ordenar usando ms sql
fuente
Un punto que aún no se ha señalado es la velocidad . Sé que es una vieja pregunta respondida, pero creo que esto merece un comentario / respuesta directa:
Cuando usé CTE la primera vez, me sorprendió por su velocidad. Era un caso similar a un libro de texto, muy adecuado para CTE, pero en todos los casos en que alguna vez usé CTE, hubo una ganancia de velocidad significativa. Mi primera consulta fue compleja con tablas derivadas, la ejecución de largos minutos. Con CTE tomó fracciones de segundos y me sorprendió, que incluso es posible.
fuente
prueba esto
fuente