2007-01-24

SQL Server2005数据库查询中使用CTE

来源: 本站收集整理 作者:佚名 评论 0 条
 

通用表表达式(CTEs)是SQL Server 2005的一项新功能。它们类似于alias(如在SELECT T1.* FROM MyTable T1中),不过功能更为强大。本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。您可以在SELECT、INSERT、DELETE、UPDATE或CTEATE VIEW语句中建立一个CTE。CTE类似于派生表,但拥有几项优点。

CTE的优点

与派生表不同,CTE能够引用自己本身。假如您不必存储视图,您可以用一个CTE来代替它。在一个语句中,您还可以多次引用CTE。应用CTE,您可以通过一个派生栏对结果进行分组。

之前,我曾写过有关原子和分子查询的文章。原子查询建立一个表,而分子查询建立在原子查询之上,提供清楚与重复利用。应用CTE也可以达到同样的目的。您可以将查询区域分割成可读的“块”,然后用这些块建立一个复杂的查询。执行递归查询是CTE最重要也是最强大的功能。

建立CTE

CTE通过要害字WITH建立,其模板为:

WITH CTE_name[ (column_name [,...n] ) ]



AS



( CTE_query_specification )

假如在CTE定义中提到的栏名称是唯一的,那么您可以不必给它们命名。不过,您同样也可以对它们重新命名。

下面的例子应用到SQL Server 2005中的AdventureWorks样本数据库。这个数据库被高度规格化,因此需要几个连接来集合与雇员有关的信息。视图简化了这一操作,但也收集了所有有关雇员的信息,而您可能仅仅需要其中一部分资料。

AdventureWorks的雇员数据分布在几个表中;而且,雇员与经理被存储在同一个表中(HumanResources.Employee),而他们的姓名(及其它数据)则存储在Person.Contact表中,这使得这个问题更加复杂。

首先,我们建立一个恢复雇员姓名的CTE。

WITH cte_Employee



AS



(



SELECTe.EmployeeID, c.FirstName, c.MiddleName, c.LastName,



e.Title AS JobTitle, c.Phone, e.ManagerID



FROMHumanResources.EmployeeAS e 



INNER JOIN Person.ContactAS c ON c.ContactID = e.ContactID



)

然后,我们可从CTE中选择一栏或几栏,就像它是一个标准的表或视图。

接着我们再进一步。我们需要雇员和他们经理的姓名,于是我们使用CTE两次,把它自身连接起来。下面是完整的查询代码:


(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:SQL Server查询处理器机制与结构(上)  
下一篇:一些SQL Server的应用实例
    评论加载中…
WITH cte_Employee



AS



(



SELECTe.EmployeeID, c.FirstName, c.MiddleName, c.LastName,



e.Title AS JobTitle, c.Phone, e.ManagerID



FROMHumanResources.EmployeeAS e



INNER JOIN Person.ContactAS c ON c.ContactID = e.ContactID



)



SELECT E.FirstName   ' ' E.LastName Employee,



M.FirstName   ' ' M.LastName Manager



FROMcte_Employee AS E



LEFT OUTER JOIN cte_Employee AS M



ON E.ManagerID = M.EmployeeID
共2页: 上一页 1 [2] 下一页
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号