Builder.com.cn
通用表表达式(CTEs)是SQLServer2005的一项新功能。它们相似于alias(如在SELECTT1.*FROMMyTableT1中),不过功能更为强大。本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。您能够在SELECT、INSERT、DELETE、UPDATE或CTEATEVIEW语句中创建一个CTE。CTE相似于派生表,但拥有几项优势。
CTE的优势
与派生表不一样,CTE可以引用本身自己。若是您没必要存储视图,您能够用一个CTE来代替它。在一个语句中,您还能够屡次引用CTE。应用CTE,您能够经过一个派生栏对结果进行分组。
以前,我曾写过有关原子和分子查询的文章。原子查询创建一个表,而分子查询创建在原子查询之上,提供清晰与重复利用。应用CTE也能够达到一样的目的。您能够将查询区域分割成可读的“块”,而后用这些块创建一个复杂的查询。执行递归查询是CTE最重要也是最强大的功能。
创建CTE
CTE经过关键字WITH创建,其模板为:
WITHCTE_name[(column_name[,...n])]AS(CTE_query_specification)
若是在CTE定义中提到的栏名称是惟一的,那么您能够没必要给它们命名。不过,您一样也能够对它们从新命名。
下面的例子应用到SQLServer2005中的AdventureWorks样本数据库。这个数据库被高度规格化,所以须要几个链接来集合与雇员有关的信息。视图简化了这一操做,但也收集了全部有关雇员的信息,而您可能仅仅须要其中一部分资料。
AdventureWorks的雇员数据分布在几个表中;并且,雇员与经理被存储在同一个表中(HumanResources.Employee),而他们的姓名(及其它数据)则存储在Person.Contact表中,这使得这个问题更加复杂。
首先,咱们创建一个恢复雇员姓名的CTE。
WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)
而后,咱们可从CTE中选择一栏或几栏,就像它是一个标准的表或视图。
接着咱们再进一步。咱们须要雇员和他们经理的姓名,因而咱们使用CTE两次,把它自身链接起来。下面是完整的查询代码:
WITHcte_EmployeeAS(SELECTe.EmployeeID,c.FirstName,c.MiddleName,c.LastName,e.TitleASJobTitle,c.Phone,e.ManagerIDFROMHumanResources.EmployeeASeINNERJOINPerson.ContactAScONc.ContactID=e.ContactID)SELECTE.FirstName+''E.LastNameEmployee,M.FirstName+''M.LastNameManagerFROMcte_EmployeeASELEFTOUTERJOINcte_EmployeeASMONE.ManagerID=M.EmployeeID
限制:不能在一个语句中创建两个CTE。
总结
CTE是SQLServer2005的一项强大而灵活的功能。它使得SQLServer的可读性更强,更易于管理,下降了查询的复杂程度。如上所述,您能够在一个SQLServer语句中屡次应用CTE。
转载自:http://www.yixia.net/2/172366.htmlhtml