SQL递归查询

  工作两个月了,一直就想着有些关联地区的表设计的时候完全可以顺便把AreaName也存了,为什么不用,这样老用递归或其他再去查询多费,不过想想:多个AreaName字段没事,要是多几十万个AreaName......

      one:

省市的:有depth可以控制深度

WITH t2(areaID,parentID,areaName,depth) AS  --需要的字段,depth可以理解为临界点,SQL有可以设置临界点的函数,会执行成功但有错误消息,所以最好能自己给个 level 字段控制遍历(如下列子)

(
SELECT areaID,parentID,areaName,depth FROM dbo.Mem_cf_Area WHERE areaID=1027002005 --查询 areaName= 宜君县 areaID=1027002005

UNION ALL

SELECT Mem_cf_Area.areaID,Mem_cf_Area.parentID,Mem_cf_Area.areaName,Mem_cf_Area.depth FROM t2 INNER JOIN dbo.Mem_cf_Area ON dbo.Mem_cf_Area.areaID=t2.parentID
)

SELECT areaID,parentID,areaName,depth FROM t2 WHERE depth<=1 ORDER BY areaID --depth <=1 就是省了

结果:

 

 

  two:  递归运用到其他

  之前有一个会员列表的小组积分字段(gradeScore)

     小组积分:

                

    就是一个二叉树组(积分规则很变态,不列了)

    刚开始是想用游标去遍历,遍历一个就将这个ID放入临时表,但好像很麻烦,网上查了下可以用  SQL with as 实现递归

    不管用哪种方式都要遍历二叉树,那就用递归

    t2为临时表放你需要的字段

WITH t2(ID,recomID,level) AS    --需要的字段,level可以理解为临界点,控制在你需要的子代代数。如果不设的话,数据库会全部遍历出来
(
   SELECT ID,recomID,0 FROM dbo.Mem_cf_Member WHERE recomID=26   --开始将level设为0   UNION ALL
   SELECT dbo.Mem_cf_Member.ID,dbo.Mem_cf_Member.recomID,level+1 FROM t2 INNER JOIN dbo.Mem_cf_Member ON t2.ID=dbo.Mem_cf_Member.recomID  --执行一条select level+1
)
SELECT SUM(gradeScore) FROM dbo.Mem_cf_MemberMoney WHERE memID IN(SELECT ID FROM t2 WHERE level <=2) --设置level,查询积分这里的积分并没有包含 26 

 

 结果:这里的积分并没有包含 26 的个人积分(与数据表之间的关系相关)

  

 

总结:学了 1+1 =2 ,你就要学会用 1+1=2去算 一块钱 加一块钱 是两块钱

 

 

 

posted @ 2013-06-10 11:20  xieWanQi  阅读(397)  评论(0)    收藏  举报