当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server2005数据库查询中使用CTE

MSSQL
开源MySQL公司停止提供企业版源代码tar包
细化解析:MySQL+Webmin轻松创建数据库
用mysql做站点时怎样记录未知错误的发生
SQL数据库操作类
如何利用SQL Server数据库快照形成报表
SQL Server中应当怎样得到自动编号字段
SQL Server数据库连接中常见的错误分析
详细讲解SQL Server数据库的文件恢复技术
轻松掌握SQL Server数据库的六个实用技巧
SQL Server数据库涉及到的数据仓库概念
深入了解SQL Server 2008 商业智能平台
剖析SQL Server 事务日志的收缩和截断
如何在不同版本的SQL Server中存储数据
怎样缩小SQL Server数据库的日志文件
SQL Server中两种修改对象所有者的方法
轻松掌握SQL Server存储过程的命名标准
怎样从旧版本SQL Server中重新存储数据
快速掌握如何使用SQL Server来过滤数据
教你快速掌握两个SQL Server的维护技巧
有效地使用 SQL事件探查器的提示和技巧

MSSQL 中的 SQL Server2005数据库查询中使用CTE


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 123 ::
收藏到网摘: n/a

通用表表达式(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_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两次,把它自身连接起来。下面是完整的查询代码:

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。