我需要做这样的事情,但 SQL Server 2008 不喜欢它。我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最佳方式,但我的重点是 WITH 语句的功能,而不是 select 和 where 语句。
WITH stuff1 AS(从 startdate > 0 的员工中选择名称、开始日期、id)
WITH stuff2 AS(从 stuff1 中选择名称、开始日期、id)
select * from stuff2 where id > 10
我需要做这样的事情,但 SQL Server 2008 不喜欢它。我的查询实际上比这更复杂,我意识到这不是完成我正在做的事情的最佳方式,但我的重点是 WITH 语句的功能,而不是 select 和 where 语句。
WITH stuff1 AS(从 startdate > 0 的员工中选择名称、开始日期、id)
WITH stuff2 AS(从 stuff1 中选择名称、开始日期、id)
select * from stuff2 where id > 10
我一直这样做:
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 链。
您也许可以对我们进行一系列子查询。或嵌套在 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
不,正如我前几天发现的那样,您只能在声明中包含一个 CTE。
编辑: WITH 语句是一个通用表表达式,非常方便的功能。