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

MSSQL
编程管理sql server的帐号
自己改写的一个sql server 2000的分页存储过程
通过SQL定时分析表监控Unix系统性能
SQL Server磁带数据备份
构造SQL Server的安全门
利用索引提高SQLServer数据处理效率
从SQL备份文件中导入现存数据库中
SQL2005较之SQL2000的改进
SQL SERVER2000中订阅与发布的具体操作
SQL Server中解决死锁的新方法介绍
SQL注入漏洞入侵的过程及其防范措施
查询分析器设置断点单步调试存储过程
SQL Server为Web浏览器提供图像
教你在SQL Server中由原子建立分子查询
关于SQL Server业务规则链接技术探讨
SQL Server 管理常用的SQL和T-SQL
探讨SQL Server数据库中空值处理技巧
SQL Server数据库中使用触发器经验谈
四项技术提高SQL Server性能
SQL Server 2000桌面引擎默认配置空口令漏洞

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 69 ::
收藏到网摘: 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。