zlb

SQL中的CTE应用——递归查询(树)

下面是一张递归表结构

organno                                           name                       uporganno      GrpNo

00000000000000000001 山东淄博交通运输集团有限公司                  NULL 00000000000000000001

00000000000000000002 连云港新东方国际货柜码头有限公司          NULL 00000000000000000002

00000000000000000003 河口区供电公司                                  NULL 00000000000000000003

00000000000000000004 济南鼎隆典当有限公司                          NULL 00000000000000000004


 比如我们要查询organno = 00000000000000000338,并且uporganno00000000000000000338的数据怎么办呢?(返回结果如下)

organno                          name                      uporganno                                  GrpNo

00000000000000000338 昂立集团                        NULL                         00000000000000000189     

00000000000000000348 昂立北京分公司        00000000000000000338     00000000000000000189

00000000000000000368 昂立集团本部         00000000000000000338 00000000000000000189

00000000000000000349 昂立北分海淀支公司 00000000000000000348 00000000000000000189

00000000000000000350 昂立海淀中关村营业部 00000000000000000349 00000000000000000189

00000000000000000351 昂立北分知春路营业部 00000000000000000349 00000000000000000189 

 

代码
 WITH cte (organno, name, uporganno,GrpNo) as
 (
     
SELECT organno, name, uporganno,GrpNo
     
FROM TDOrgan
     
WHERE  organno ='00000000000000000338' --or uporganno='00000000000000000338'
   UNION ALL
     
--select a.organno, a.name, a.uporganno from TDOrgan as a ,cte as b where a.uporganno=b.organno
     SELECT tdo.organno, tdo.name, tdo.uporganno,tdo.GrpNo
     
FROM cte 
       
JOIN TDOrgan AS tdo 
         
ON cte.organno = tdo.uporganno 
 )
 
--Uses MAXRECURSION to limit the recursive levels to 2
 SELECT *
 
FROM cte
 
OPTION (MAXRECURSION 3);

 

 这是从上向下查,

 

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

posted on 2010-03-08 15:56  zlb  阅读(354)  评论(0)    收藏  举报

导航