Могу ли я дважды использовать WITH в TSQL для фильтрации набора результатов, например, моего примера?

Мне нужно сделать что-то подобное, но SQL Server 2008 ему не нравится. Мой запрос на самом деле более сложный, чем этот, и я понимаю, что это не лучший способ выполнить то, что я делаю, но основное внимание уделено функциональности оператора WITH, а не операторам select и where.

С stuff1 AS (     выберите имя, startdate, id от сотрудников, где startdate > 0)

С stuff2 AS (     select name, startdate, id from stuff1)

выберите * from stuff2, где id > 10

Ответ 1

Я делаю это все время:

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

Насколько я могу судить, я не достиг предела в CTE.

Единственное, что вы не можете сделать (что было бы очень полезно), это повторное использование CTE в отдельном 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. Вместо этого вам нужно снова и снова скопировать всю цепочку CTE.

Ответ 2

Вы можете иметь для нас ряд подзапросов. Или подзапросы, вложенные в CTE.

Пример подзапросов с использованием Northwind:

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

Вы можете использовать два CTE, но, возможно, не так, как вы хотели, смотрите:
http://www.4guysfromrolla.com/webtech/071906-1.shtml

Ответ 3

Нет, вы можете иметь только один CTE в заявлении, как я узнал на днях.

EDIT: И этот оператор WITH - это выражение Common Table Expression, очень удобная функция.