2011-03-03 21 views
11

escribimos CTE SQL, como a continuación se¿Cuál es la ventaja de la expresión de tabla común en SQL Server

WITH yourCTE AS 
(
SELECT .... FROM :... WHERE..... 
) SELECT * FROM yourCTE 

lo que sería la ventaja de poner en sql con el bloque. Creo que si ponemos sql complicado con block entonces podemos escribir sql como SELECT * FROM yourCTE. como si estuviera accediendo a la vista. lo que se agrega la ventaja de usar CTE en términos de rendimiento. por favor discutelo. gracias

Respuesta

3

This MSDN article lo describe de la mejor manera. La conclusión es que, si ya está seleccionando los datos de una vista, no tiene que ajustarlos en un CTE y, a continuación, seleccionarlos desde el CTE. No creo que haya mucha diferencia (en cuanto al rendimiento) entre un CTE y una vista. Al menos no en mi experiencia (y he estado trabajando con algunas estructuras de bases de datos complejas que albergan toneladas de registros recientemente). Un CTE es, sin embargo, ideal para selecciones recursivas.

Otra cosa, sin embargo, es que un CTE puede ser beneficioso si selecciona el mismo subconjunto de datos unidos varias veces en sus consultas y NO tiene una vista definida para él. Creo que es excesivo si va a unir datos solo para una sola consulta y luego completarlos en un CTE. La ruta de consulta seguirá recibiendo en caché a pesar de que no está utilizando un CTE ...

+0

u dijo CTE es ideal para selecciona recursivas. lo que quieres decir recursivo seleccionar. por favor hazme entender solo por sql que es recursivo seleccionado por CTE. – Thomas

+0

Nuevamente, MSDN acude al rescate con un artículo detallado sobre Consultas recursivas usando CTE: http://msdn.microsoft.com/en-us/library/ms186243.aspx. También consulte la respuesta de Marc con una explicación muy breve (pero fácilmente comprensible) de lo que es una consulta recursiva. – FarligOpptreden

12

Hay una serie de casos en los que un CTE puede ser realmente útil:

  • consultas recursivas, como subir un árbol de jerarquía - que es extremadamente complicado y engorroso sin CTE (ver here for a sample of a recursive CTE)

  • cualquier momento que desee utilizar una de las funciones de clasificación como ROW_NUMBER(), RANK(), NTILE() y así sucesivamente (ver here for info on ranking functions)

  • En general, cualquier caso en el que primero deba seleccionar algunas filas/columnas, según algunos criterios, y luego hacer algo con estas, p. actualizar una tabla, eliminar duplicados, etc.

Un caso que a menudo utilizan un CTE de está borrando todas pero la más reciente de filas de un conjunto dado de datos, por ejemplo, si tiene clientes y una relación 1: n con sus pedidos, y desea eliminar todos menos el pedido más reciente (basado en un OrderDate), para cada cliente es bastante complicado hacer esto en SQL sin un CTE.

Con un CTE y las funciones de clasificación, es una brisa:

;WITH CustomerOrders AS 
(
    SELECT 
     c.CustomerID, o.OrderID, 
     ROW_NUMBER() OVER(PARTITION BY c.CustomerID ORDER BY o.OrderDate DESC) AS 'RowN' 
    FROM 
     dbo.Customer c 
    INNER JOIN 
     dbo.Orders o ON o.CustomerID = c.CustomerID 
) 
DELETE FROM 
    dbo.Orders 
FROM 
    CustomerOrders co 
WHERE 
    dbo.Orders.OrderID = co.OrderID 
    AND co.RowN > 1 

Con ello, se crea una "visión en línea" que las particiones de CustomerID (por ejemplo, cada cliente recibe rownumbers a partir de 1), ordenado por OrderDate DESC (primero el pedido más nuevo). Para cada cliente, la orden más reciente y más reciente tiene RowN = 1, por lo que puede simplemente eliminar todas las otras filas y haber hecho lo que quería hacer - pedazo de pastel con un CTE - código desordenado sin él ...

+0

¿Cómo sabe el RDBMS qué tabla debe eliminar cuando simplemente dice: 'eliminar de CTE', como en su ejemplo? –

+0

@Andriy M: actualicé mi consulta, esto debería hacerlo más obvio. –

+0

Mucho más obvio de hecho, gracias.:) –

-2

Buenas noches amigos ... 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 temporales 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 instrucción donde se definió y no se puede usar en otras sesiones.

Sintaxis de declarar CTE (expresión de tabla común): -

with [Name of CTE] 
as 
(
Body of common table expression 
) 

Le permite tomar un ejemplo: -

CREATE TABLE Employee([EID] [int] IDENTITY(10,5) NOT NULL,[Name] [varchar](50) NULL) 

insert into Employee(Name) values('Neeraj') 
insert into Employee(Name) values('dheeraj') 
insert into Employee(Name) values('shayam') 
insert into Employee(Name) values('vikas') 
insert into Employee(Name) values('raj') 

CREATE TABLE DEPT(EID INT,DEPTNAME VARCHAR(100)) 
insert into dept values(10,'IT') 
insert into dept values(15,'Finance') 
insert into dept values(20,'Admin') 
insert into dept values(25,'HR') 
insert into dept values(10,'Payroll') 

He creado dos tablas empleados y Dept y se inserta 5 filas en cada tabla . Ahora me gustaría unirme a estas tablas y crear un conjunto de resultados temporales para usarlo más.

With CTE_Example(EID,Name,DeptName) 
as 
(
select Employee.EID,Name,DeptName from Employee 
inner join DEPT on Employee.EID =DEPT.EID 
) 
select * from CTE_Example 

Vamos a tomar cada línea de la declaración una por una y entender.

Para definir CTE escribimos "con" cláusula, a continuación, damos un nombre a la expresión de tabla, nombre aquí me he dado como "CTE_Example"

Entonces escribimos "como" y encierran nuestro código en dos soportes (---), 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, así que podemos decir que es como una vista, donde estamos definiendo y usando el ver en un solo lote y CTE no se almacena 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 a la que se hace referencia que se están utilizando en CTE. Tomemos un ejemplo para entender este hecho.

With CTE_Example(EID,DeptName) 
as 
(
select EID,DeptName from DEPT 
) 
delete from CTE_Example where EID=10 and DeptName ='Payroll' 

En la declaración anterior que están suprimir una fila de CTE_Example y se eliminarán los datos de la tabla de referencia "DEPARTAMENTO" que se utiliza en el CTE.

Espero que este artículo sea útil para usted y podrá utilizar CTE siempre que lo considere adecuado.

+0

Sé que esta publicación es algo antigua, pero como la gente ha votado negativamente esta respuesta, pensé que agregaría una razón por la que lo hice. El OP pregunta qué ventaja proporcionaría un CTE. Esta publicación nos muestra CÓMO hacer un CTE, no por qué debería ser utilizado. – Semperfi89

0
  1. Haciendo consulta recursiva.
  2. Mantiene una salida de consulta virtualmente en un área temporal nombrada como dada durante la definición.
  3. No es necesario guardar los metadatos.
  4. Útil cuando hay necesidad de hacer más operación en alguna salida de consulta.
  5. Query output conserva mientras se ejecuta la consulta
  6. Mejor uso de la celebración de datos temporales para su posterior procesamiento.
  7. Permitir más opciones de agrupación que una sola consulta.
  8. le permiten obtener datos escalares de una consulta complicada
Cuestiones relacionadas