技术开发 频道

SQL2005/2008中的CTE应用——递归查询

  【IT168 技术】微软从SQl2005起引入了CTE(Common Table Expression)以强化T-SQL。这是一个类似于非持久视图的好东东。

  按照MSDN介绍

  1、公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。

  CTE 可用于:

  创建递归查询。有关详细信息,请参阅使用公用表表达式的递归查询。

  在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。

  启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。

  在同一语句中多次引用生成的表。

  使用 CTE 可以获得提高可读性和轻松维护复杂查询的优点。查询可以分为单独块、简单块、逻辑生成块。之后,这些简单块可用于生成更复杂的临时 CTE,直到生成最终结果集。可以在用户定义的例程(如函数、存储过程、触发器或视图)中定义 CTE。

  2、公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。当某个查询引用递归 CTE 时,它即被称为递归查询。递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料清单方案(其中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其他父级产品的组件)中的数据。

  递 归 CTE 可以极大地简化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句中运行递归查询所需的代码。在 SQL Server 的早期版本中,递归查询通常需要使用临时表、游标和逻辑来控制递归步骤流。有关公用表表达式的详细信息,请参阅使用公用表表达式。

  这里举例说明如下:

  为了描述方便,邀月特地列举了一个常见的自关联Table

  表结构如下:

CREATE TABLE [dbo].[CategorySelf](
    
[PKID] [int] IDENTITY(1,1) NOT NULL,
    
[C_Name] [nvarchar](50) NOT NULL,
    
[C_Level] [int] NOT NULL,
    
[C_Code] [nvarchar](255) NULL,
    
[C_Parent] [int] NOT NULL,
    
[InsertTime] [datetime] NOT NULL,
    
[InsertUser] [nvarchar](50) NULL,
    
[UpdateTime] [datetime] NOT NULL,
    
[UpdateUser] [nvarchar](50) NULL,
    
[SortLevel] [int] NOT NULL,
    
[CurrState] [smallint] NOT NULL,
    
[F1] [int] NOT NULL,
    
[F2] [nvarchar](255) NULL

CONSTRAINT [PK_OBJECTCATEGORYSELF] PRIMARY KEY CLUSTERED
(
    
[PKID] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
)
ON [PRIMARY]

GO
0
相关文章