2009-01-28 7 views
13

Necesito hacer algo como esto pero a SQL Server 2008 no le gusta. Mi consulta es en realidad más compleja que esta y me doy cuenta de que esta no es la mejor manera de lograr lo que estoy haciendo, pero mi atención se centra en la funcionalidad de la declaración WITH y no en las instrucciones select y where.¿Puedo usar WITH en TSQL dos veces para filtrar un conjunto de resultados como mi ejemplo?

CON stuff1 AS ( seleccione Nombre, Fecha de inicio, la identificación de los empleados, donde startdate> 0)

CON stuff2 AS ( nombre de selección, startdate, ID desde stuff1)

seleccionar * de stuff2 donde id> 10

+0

No hay de qué avergonzarse al usar una tabla temporal o una variable de tabla cuando necesita una – Juliet

Respuesta

29

lo hago todo el tiempo :

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 

Por lo que puedo decir, no he llegado a un límite en los CTE.

La única cosa que no puede hacer (lo que sería muy útil) es CTE reutilización en distintos SELECT s:

WITH stuff1 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM employees 
    WHERE startdate > 0 
) 
,stuff2 AS (
    SELECT name 
      ,startdate 
      ,id 
    FROM stuff1 
) 
SELECT * 
FROM stuff2 
WHERE id > 10 
; 
SELECT * 
FROM stuff2 
WHERE id < 10 

Say. En su lugar, debe copiar y pegar toda la cadena CTE nuevamente.

+0

hace que lo anterior funcione sin; terminador entre el primero y el segundo selecciona? –

+0

No. Los CTE solo se pueden usar en una sola operación. INSERT/SELECT/DELETE lo que sea, pero básicamente se consumen en ese punto. –

+0

bueno saber, gracias! –

-3

No, solo puedes tener un CTE en una declaración como descubrí el otro día.

EDIT: Y esa declaración WITH es una expresión común de tabla, característica muy útil.

+0

En realidad, puede tener múltiples CTE, y pueden construir entre sí e incluso múltiples CTE dentro de la cadena CTE, separar con una coma - solo uno Con la declaración se puede utilizar. –

+0

No me había dado cuenta de que tenían que estar separados por comas. Esto será útil. He estado leyendo mi libro de SQL 2008 y mencionan CTE, pero no mencionan el uso de múltiples CTE en una consulta, lo cual es una pena. – Kezzer

+0

Sí, publiqué un ejemplo a continuación. Lo he estado usando mucho durante el último año en un puerto de un sistema 3GL. –

0

Puede hacernos una serie de subconsultas. O subconsultas anidadas en un CTE.

Un ejemplo de sub-consultas utilizando Neptuno:

SELECT * FROM 
    (SELECT * FROM 
     (SELECT * FROM dbo.Employees WHERE Country = 'USA') as TableFiltered1 
    ) AS TableFilterd2 WHERE City = 'Seattle' 

Se pueden utilizar dos CTE, pero quizás no de la manera que quería ver:
http://www.4guysfromrolla.com/webtech/071906-1.shtml

+1

En mi experiencia, cualquier cosa con subconsultas se puede transformar muy rápidamente para usar CTE. El nivel de anidamiento reducido y la capacidad de superponerlos muy fácilmente en un estilo de declaración y no repetirse a sí mismo hace una diferencia significativa en la legibilidad y la capacidad de mantenimiento. –

+0

Estoy de acuerdo. Por eso incluí el enlace que mostraba un ejemplo de CTE separado por comas. Creo que es el tercer o cuarto ejemplo en el enlace '4guys'. Estaba tratando de diseñar todas las opciones. – BuddyJoe

Cuestiones relacionadas