Можно ли дважды использовать WITH в TSQL для фильтрации результирующего набора, как в моем примере? - PullRequest
14 голосов
/ 28 января 2009

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

С stuff1 AS ( выберите имя, начальную дату, идентификатор от сотрудников, где начальная дата> 0)

С stuff2 AS ( выберите имя, начальную дату, идентификатор из материала1)

select * from stuff2, где id> 10

Ответы [ 3 ]

30 голосов
/ 29 января 2009

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

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.

0 голосов
/ 28 января 2009

Возможно, вы сможете нам выполнить ряд подзапросов. Или вложенные запросы, вложенные в 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

0 голосов
/ 28 января 2009

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

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

...