WITH CTE_name[ (column_name [,...n] ) ]AS( CTE_query_specification )
如果在CTE定义中提到的栏名称是唯一的,那么您可以不必给它们命名。不过,您同样也可以对它们重新命名。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/sqlserver/)下面的例子应用到SQL Server 2005中的AdventureWorks样本数据库。这个数据库被高度规格化,因此需要几个连接来集合与雇员有关的信息。视图简化了这一操作,但也收集了所有有关雇员的信息,而您可能仅仅需要其中一部分资料。
AdventureWorks的雇员数据分布在几个表中;而且,雇员与经理被存储在同一个表中(HumanResources.Employee),而他们的姓名(及其它数据)则存储在Person.Contact表中,这使得这个问题更加复杂。
首先,我们建立一个恢复雇员姓名的CTE。
WITH cte_EmployeeAS(SELECTe.EmployeeID, c.FirstName, c.MiddleName, c.LastName,e.Title AS JobTitle, c.Phone, e.ManagerIDFROMHumanResources.EmployeeAS e INNER JOIN Person.ContactAS c ON c.ContactID = e.ContactID)
然后,我们可从CTE中选择一栏或几栏,就像它是一个标准的表或视图。
接着我们再进一步。我们需要雇员和他们经理的姓名,于是我们使用CTE两次,把它自身连接起来。下面是完整的查询代码:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/sqlserver/)WITH cte_EmployeeAS(SELECTe.EmployeeID, c.FirstName, c.MiddleName, c.LastName,e.Title AS JobTitle, c.Phone, e.ManagerIDFROMHumanResources.EmployeeAS eINNER JOIN Person.ContactAS c ON c.ContactID = e.ContactID)SELECT E.FirstName + ' ' E.LastName Employee,M.FirstName + ' ' M.LastName ManagerFROMcte_Employee AS ELEFT OUTER JOIN cte_Employee AS MON E.ManagerID = M.EmployeeID
限制:不能在一个语句中建立两个CTE。
总结
CTE是SQL Server 2005的一项强大而灵活的功能。它使得SQL Server的可读性更强,更易于管理,降低了查询的复杂程度。如上所述,您可以在一个SQL Server语句中多次应用CTE。