你们好,今天咱们来学习一下公用表表达式。在项目中须要编写SQL语句,由于本身自己对SQL Server知之甚少,一些较复杂的SQL语句,我是写不出来的。因而,请教个人一位好朋友,数据库MVP。他给我发来了一段SQL语句,至关好用。在佩服他的SQL语句时,我发现了公用表表达式这个概念,因而就Bing了一篇文章,用心研究了一番。在这里与你们分享一下个人学习心得。数据库
公用表表达式(Common Table Expressions)express
CTE(公用表表达式)的做用相似于咱们的临时表,就是能够做为SELECT、CREATE、UPDATE等语句中的一部分。它也能够简化咱们的语句,提升数据库操做性能。就像我上一篇讲到的SQL分页查询:函数
--------假设咱们有一个100W条数据的订单表,须要分页查询。 DECLARE @RowNumber AS INT, @PageNumber AS INT SET @RowNumber=5 SET @PageNumber=2 ;WITH OrderedOrders AS ( SELECT ROW_NUMBER() OVER(ORDER BY OrderDate) AS RowNumber * FROM Sales.SalesOrderHeader ) SELECT * FROM OrderOrders WHERE RowNumber BETEEWN ((@PageNumber-1)*@RowNumber)+1) AND (@PageNumber*@RowNumber)
在这里,咱们是把已经每列都生成了标识后的数据,放入了CTE中,以充当下面的SELECT 语句的一部分(数据源)。性能
这是CTE的基本语法学习
expression_name:公共表表达式的名字优化
[(column_name[,…n])]:这个是查询字段列表,须要查询的字段。(当要查询的字段匹配数据源中全部的列时,这个列表能够省略,默认查询所有列)spa
(CTE_query_definition):咱们要查询的SQL语句翻译
使用公共表表达式递归查询(Recursive Queries Using Common Table Expressions)code
若是你认为CTE只有简简单单的临时表功能的话,那你就过小看它了。它其实还有一个很是实用、很是有意义的功能。递归函数,你们应该了解过。就是根据某个条件来判断,进行自我调用。使用Recursive CTE(递归公共表表达式)进行查询,与通常的递归函数原理是同样的。说白了,就是CTE引用CTE查询到的结果。上例子吧:blog
这段代码的做用,是要查询出员工信息。信息包括,员工的上级领导编号,员工自身编号,员工职位,员工所在部门编号、员工等级。研究一下这段代码:
咱们把这段代码分为四部分,第一部分Anchor member definition,第二部分Recursive member definition,第三部分Statement that executes the CTE.
Anchor member definition:不知道应该怎样翻译它,它的做用就像是一个调用函数,它触发递归查询。
Recursive member definition:它的做用就像是一个递归函数,在这里,咱们把Anchor member definition查询到的结果看成参数 ,来查询Recursive member definition.将Recursive member definition查询到的结果看成参数,继续查询Recursive member definition,直道没有结果返回。
Statement that executes the CTE: 外部调用CTE的语句。
咱们一步一步来执行一下这段代码: Anchor member definition,会查询出来等级最高的员工,他没有上级领导。结果以下:
Recursive member definition 经过 Anchor member definition返回的结果做为参数,根据e.ManagerID=d.Employee条件来查询。由于Anchor member definition返回的结果是EmployeeID为1,因此Recursive member definition 会去查询Mananger=1的数据。获得的结果以下:
接着,会拿这个结果看成参数,继续查询。此次回去查询Manager=273的数据,获得结果以下图:
继续拿这个结果做参数,继续查询。此次会去查询Manager IN (16,274,285)的数据,获得结果以下:
咱们执行查询CTE 会获得以下结果:
上图画红线的数据,是Anchor member definition 的数据,咱们经过UNION ALL 将它与Recursive member definition 链接。经过这个一步步查询,咱们能够发现,Anchor member definition 只是提够了一次数据,Recursive member definition是递归执行者。
Recursive CTE,也能够起到优化语句的效果。咱们彻底能够经过递归查询,把那些不得不执行屡次的相同语句,简化成一条递归查询便可。
原文地址:http://technet.microsoft.com/en-us/library/ms186243(v=SQL.105).aspx