资源描述:
《cte应用--递归查询》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、SQLServer教程:SQL2005/2008中的CTE应用--递归查询2011年11月24日 来源:51Test.NET 培训课程 发布课程 加入收藏-【51Test.NET-SQLServer教程:SQL2005/2008中的CTE应用--递归查询】:微软从SQl2005起引入了CTE(CommonTableExpression)以强化T-SQL。这是一个类似于非持久视图的好东东。按照MSDN介绍1、公用表表达式(CTE)可以认为是在单个SELECT、INSERT、UPDATE、DELETE或CREATE
2、VIEW语句的执行范围内定义的临时结果集。CTE与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE可自引用,还可在同一查询中引用多次。CTE可用于:创建递归查询。有关详细信息,请参阅使用公用表表达式的递归查询。在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。启用按从标量嵌套select语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。在同一语句中多次引用生成的表。使用CTE可以获得提高可读性和轻松维护复杂查询的优点。查询可以分为单独块、简
3、单块、逻辑生成块。之后,这些简单块可用于生成更复杂的临时CTE,直到生成最终结果集。可以在用户定义的例程(如函数、存储过程、触发器或视图)中定义CTE。2、公用表表达式(CTE)具有一个重要的优点,那就是能够引用其自身,从而创建递归CTE。递归CTE是一个重复执行初始CTE以返回数据子集直到获取完整结果集的公用表表达式。当某个查询引用递归CTE时,它即被称为递归查询。递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料清单方案(其中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其他父级产品的
4、组件)中的数据。递归CTE可以极大地简化在SELECT、INSERT、UPDATE、DELETE或CREATEVIEW语句中运行递归查询所需的代码。在SQLServer的早期版本中,递归查询通常需要使用临时表、游标和逻辑来控制递归步骤流。有关公用表表达式的详细信息,请参阅使用公用表表达式。 这里举例说明如下: 为了描述方便,邀月特地列举了一个常见的自关联Table表结构如下:CREATETABLE[dbo].[CategorySelf]( [PKID][int]IDENTITY(1,1)NOTNULL, [
5、C_Name][nvarchar](50)NOTNULL, [C_Level][int]NOTNULL, [C_Code][nvarchar](255)NULL, [C_Parent][int]NOTNULL, [InsertTime][datetime]NOTNULL, [InsertUser][nvarchar](50)NULL, [UpdateTime][datetime]NOTNULL, [UpdateUser][nvarchar](50)NULL, [SortLevel][
6、int]NOTNULL, [CurrState][smallint]NOTNULL, [F1][int]NOTNULL, [F2][nvarchar](255)NULL CONSTRAINT[PK_OBJECTCATEGORYSELF]PRIMARYKEYCLUSTERED( [PKID]ASC)WITH(PAD_INDEX =OFF,STATISTICS_NORECOMPUTE =OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS =ON,ALLOW_PAGE_LOCKS
7、 =ON)ON[PRIMARY])ON[PRIMARY]GO再插入一些测试数据INSERTINTO[CategorySelf]([C_Name],[C_Level],[C_Code],[C_Parent],[InsertTime],[InsertUser],[UpdateTime] ,[UpdateUser] ,[SortLevel] ,[CurrState] ,[F1] ,[F2])select'分类1',1,'0',0,GETDATE(),'testUser',DATEADD(dd,1,getdate()),'
8、CrackUser',13,0,1,'邀月备注'unionallselect'分类2',1,'0',0,GETDATE(),'testUser',DATEADD(dd,78,getdate()),'CrackUser',12,0,1,'邀月备注'unionallselect'分类3',1,'0',0,GETDATE(),'testUser',DATEADD(