zoukankan      html  css  js  c++  java
  • 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,递归,查询

查看全文
  • 相关阅读:
    对我影响最大的老师
    秋季学习总结
    介绍自己
    搭建新环境的准备工作
    我的技术博客开通啦!!
    java数组及数组的插入,删除,冒泡算法
    包(package)以及面向对象三个基本特征(继承)的介绍
    常用的Arrays类和二维数组以及二分法的介绍
    构造方法、封装、关键字(this、static)和代码块的介绍
    类和对象的介绍
  • 原文地址:https://www.cnblogs.com/linxi/p/1520125.html
  • Copyright © 2011-2022 走看看