SQL Server 2005中使用公用表表达式的递归查询(CTE是个好东西)

暑期小学期在做控制流图(CFG)相关的一个项目。我们准备用关系数据库来存储CFG的信息。在查询时,为了得到所有dominate关系的结果,使用了CTE来进行递归查询。

简单例子如下:

1. 现有表testRe结构如下

image

2. 欲得到的查询结果为找到id=’a’的项的所有pId,即b、c、d

3. 使用CTE做递归查询:

WITH Re_CTE(id, pId, Level)



AS
(
    SELECT  id, pId, 1 AS [Level]
    FROM  testRe
    WHERE id='a' 
    UNION ALL
    SELECT  t.id, t.pId, [Level] + 1
    FROM  testRe t  INNER JOIN Re_CTE ct
    ON t.id=ct.pId
)

SELECT * FROM Re_CTE

其中,Level为可选项

4. 查询结果为:

image

5. CTE的简单说明(参考MSDNhttp://msdn.microsoft.com/zh-cn/library/ms186243%28SQL.90%29.aspx):

WITH cte_name ( column_name [,...n] )

AS

(

CTE_query_definition –- Anchor member is defined.

UNION ALL

CTE_query_definition –- Recursive member is defined referencing cte_name.

)

-- Statement using the CTE

SELECT *

FROM cte_name

一个递归 CTE 结构必须至少包含一个定位点成员和一个递归成员。

执行时:

  • 将 CTE 表达式拆分为定位点成员和递归成员。
  • 运行定位点成员,创建第一个调用或基准结果集 (T0)。
  • 运行递归成员,将 Ti 作为输入,将 Ti+1 作为输出。
  • 重复步骤 3,直到返回空集。
  • 返回结果集。这是对 T0 到 Tn 执行 UNION ALL 的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值