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去算 一块钱 加一块钱 是两块钱
                    
                
                
            
        
浙公网安备 33010602011771号