16

我需要做这样的事情,但 SQL Server 2008 不喜欢它。我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最佳方式,但我的重点是 WITH 语句的功能,而不是 select 和 where 语句。

WITH stuff1 AS(从 startdate > 0 的员工中选择名称、开始日期、id)

WITH stuff2 AS(从 stuff1 中选择名称、开始日期、id)

select * from stuff2 where id > 10

4

3 回答 3

33

我一直这样做:

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 的极限。

您唯一不能做的事情(这将非常有用)是在单独SELECT的 s 中重用 CTE:

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

说。相反,您必须再次复制并粘贴整个 CTE 链。

于 2009-01-28T21:01:15.457 回答
0

您也许可以对我们进行一系列子查询。或嵌套在 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

于 2009-01-28T20:14:38.687 回答
-3

不,正如我前几天发现的那样,您只能在声明中包含一个 CTE。

编辑: WITH 语句是一个通用表表达式,非常方便的功能。

于 2009-01-28T19:46:06.263 回答