SQL 2005 递归查询

WITH digui AS
(
    SELECT ID,[Values],ParentId FROM CTES WHERE ID=1

    UNION ALL

    SELECT CTES.ID,CTES.[Values],CTES.ParentId FROM digui JOIN CTES ON CTES.ParentId = digui.ID
)
SELECT * FROM digui

/*
    一个递归的CTE最少须要包含两个查询(也称为成员)。
    第一个查询称为 定位点成员(anchor member)。定位点成员 只是一个返回有效表的查询,用于递归的基础或定位点。定位点成员 直接返回输入的根级所在行。
    第二个查询称为 递归成员(recursive member)。使该查询成为递归成员的是对 CTE 名称(digui)的递归引用。注意这种引用不同于在外部查询中对 CTE 名称的引用。
    外部查询中的引用得到的是由 CTE 返回的最终结果表,不包含递归。而内部引用是在 CTE 的结果表确定之前使用的 , 它是触发递归的关键元素 。
    不严格的说 , 对 CTE 名称的内部引用代表 "前一个结果集" 。 第一次调用递归成员时 , CTE 名称引用代表由定点成员返回的结果集 。

    递归成员 遇到返回空结果集时 , 退出循环调用。
*/

posted on 2012-05-14 17:26  多个马甲  阅读(200)  评论(0编辑  收藏  举报