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 的结果。
  • Technorati 标签: SQL SERVER,CTE,递归,查询

     

     

    posted @ 2009-07-09 21:31  小痕  阅读(456)  评论(0编辑  收藏  举报