SQL递归查询(with table as)

with [table] as
(
    select Id,PARENT_ID,DICT_TEXT,DICT_CODE, 0 as lvl from T_SYS_DICT
    where Id = '000000236'
    union all
    select d.Id,d.PARENT_ID,d.DICT_TEXT,d.DICT_CODE,lvl + 1 from [table] c inner join T_SYS_DICT d
    on c.Id = d.PARENT_ID
)
select * from [table]

表内容:

ID              DICT_TEXT       DICT_NAME         DICT_CODE
000000236	000000003	文件分类	          FileType
000000534	000000236	排污许可	          008
000000542	000000236	污染监测	          009
000000546	000000236	环境监察	          010

查询结果:

ID              DICT_TEXT       DICT_NAME         DICT_CODE       lvl
000000236	000000003	文件分类	          FileType        0
000000534	000000236	排污许可	          008             1
000000542	000000236	污染监测	          009             1
000000546	000000236	环境监察	          010             1

  

  递归CTE最少包含两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。

  递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。

 

posted @ 2015-09-02 12:04  皓月青峰  阅读(827)  评论(0)    收藏  举报