zoukankan      html  css  js  c++  java
  • SqlServer 递归查询树形数据

    一直没有在意过数据库处理树形数据的重要性,直到有一天朋友问起我关于树形数据查询的问题时才发现根本不会,正好这个时候也要用到递归进行树形数据的查询于是在网上查了一圈,语法总结如下

    参考文献:https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(WITH_TSQL);k(SQL11.SWB.TSQLRESULTS.F1);k(SQL11.SWB.TSQLQUERY.F1);k(MISCELLANEOUSFILESPROJECT);k(DevLang-TSQL)&rd=true

    一:简单的树形数据 代码如下:

    -- with一个临时表(括号中是你要查询的列名)
    with temp(ID,PID,Name,curLevel)
    as
    (
    --1:初始查询(这里的PID=-1 在我的数据中是最底层的根节点)
    select ID,PID,Name,1 as level from dbo.T_ACL_OU 
    where Deleted = 0 and PID = -1     
    union all
    --2:递归条件
    select a.ID,a.PID,a.Name, b.curLevel+1from T_ACL_OU a   --3:这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
    inner join
    temp b
    on ( a.PID=b.id)  --这个关联关系很重要,一定要理解一下谁是谁的父节点
    )
    select * from temp   --4:递归完成后 一定不要少了这句查询语句 否则会报错

    效果如图:

    这里要注意的地方是注释中的 1——4 的部分

    二:带缩进的树形数据 代码如下:

    with temp(ID,PID,Name,curLevel)
    as
    (
    --初始查询
    select ID,PID,Name,1 as curLevel from dbo.T_ACL_OU 
    where Deleted = 0 and PID = -1     
    union all
    --递归条件
    select a.ID,a.PID, convert(nvarchar(100),CONVERT(nvarchar(100), REPLICATE ('    ', b.curLevel+1)+a.Name)) as Name , b.curLevel+1   --这里的 REPLICATE函数非常重要,用于缩进空格用。不懂得可以在SQLserver中选中后按F1键
    from T_ACL_OU a 
    inner join
    temp b
    on ( a.PID=b.id)
    )
    select ID,PID,Name,curLevel from temp

    效果如图:

    三:查询是否有子节点

    with temp(ID,PID,HandNo,Name,curLevel,pLevel,haveChild)
    as
    (
    --初始查询
    select ID,PID,HandNo,Name,1 as level,0 as pLevel,1 as haveChild from dbo.T_ACL_OU 
    where Deleted = 0 and PID = -1     
    union all
    --递归条件
    select a.ID,a.PID,a.HandNo,a.Name, b.curLevel+1,b.curLevel,haveChild = (case when exists(select 1 from T_ACL_OU where T_ACL_OU.PID=a.id) then 1 else 0 end)

    --(select 1 from T_ACL_OU where exists(select 1 from T_ACL_OU where a.PID=b.id)) from T_ACL_OU a inner join temp b on ( a.PID=b.id) ) select * from temp order by pLevel

    效果如图:

    这3段代码可以直接复制使用,修改一下表名和要查询的列名基本上都是通用的,写的比较简单,如果大家有什么意见建议请留言交流谢谢。

    http://www.cnblogs.com/Lixinhua-GoOn/archive/2016/01/29/5169297.html

  • 相关阅读:
    BZOJ 1911: [Apio2010]特别行动队
    BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)
    BZOJ 2243: [SDOI2011]染色(树链剖分)
    BZOJ 1834: [ZJOI2010]network 网络扩容(网络流+费用流)
    BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分)
    BZOJ 1875: [SDOI2009]HH去散步(矩阵乘法)
    BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼(矩阵乘法)
    BZOJ 2463: [中山市选2009]谁能赢呢?(博弈论)
    BZOJ 2879: [Noi2012]美食节
    BZOJ 1070: [SCOI2007]修车(费用流)
  • 原文地址:https://www.cnblogs.com/railgunman/p/6705704.html
Copyright © 2011-2022 走看看