1. -->Title:Generating test data
  2. -->Author:wufeng4552
  3. -->Date :2009-09-30 08:52:38
  4. set nocount on
  5. if object_id('tb','U')is not null drop table tb
  6. go
  7. create table tb(ID int, ParentID int)
  8. insert into tb select 1,0
  9. insert into tb select 2,1
  10. insert into tb select 3,1
  11. insert into tb select 4,2
  12. insert into tb select 5,3
  13. insert into tb select 6,5
  14. insert into tb select 7,6
  15. -->Title:查找指定節點下的子結點
  16. if object_id('Uf_GetChildID')is not null drop function Uf_GetChildID
  17. go
  18. create function Uf_GetChildID(@ParentID int)
  19. returns @t table(ID int)
  20. as
  21. begin
  22. insert @t select ID from tb where ParentID=@ParentID
  23. while @@rowcount<>0
  24. begin
  25. insert @t select a.ID from tb a inner join @t b
  26. on a.ParentID=b.id and
  27. not exists(select 1 from @t where id=a.id)
  28. end
  29. return
  30. end
  31. go
  32. select * from dbo.Uf_GetChildID(5)
  33. /*
  34. ID
  35. -----------
  36. 6
  37. 7
  38. */
  39. -->Title:查找指定節點的所有父結點
  40. if object_id('Uf_GetParentID')is not null drop function Uf_GetParentID
  41. go
  42. create function Uf_GetParentID(@ID int)
  43. returns @t table(ParentID int)
  44. as
  45. begin
  46. insert @t select ParentID from tb where ID=@ID
  47. while @@rowcount!=0
  48. begin
  49. insert @t select a.ParentID from tb a inner join @t b
  50. on a.id=b.ParentID and
  51. not exists(select 1 from @t where ParentID=a.ParentID)
  52. end
  53. return
  54. end
  55. go
  56. select * from dbo.Uf_GetParentID(2)
  57. /*
  58. ParentID
  59. -----------
  60. 1
  61. 0
  62. */
  63.  
  64. USE tempdb
  65. GO
  66.  
  67. -- 建立演示环境
  68. CREATE TABLE Dept(
  69. id int PRIMARY KEY,
  70. parent_id int,
  71. name nvarchar(20))
  72. INSERT Dept
  73. SELECT 0, 0, N'<全部>' UNION ALL
  74. SELECT 1, 0, N'财务部' UNION ALL
  75. SELECT 2, 0, N'行政部' UNION ALL
  76. SELECT 3, 0, N'业务部' UNION ALL
  77. SELECT 4, 0, N'业务部' UNION ALL
  78. SELECT 5, 4, N'销售部' UNION ALL
  79. SELECT 6, 4, N'MIS' UNION ALL
  80. SELECT 7, 6, N'UI' UNION ALL
  81. SELECT 8, 6, N'软件开发' UNION ALL
  82. SELECT 9, 8, N'内部开发'
  83. GO
  84.  
  85. -- 查询指定部门下面的所有部门
  86. DECLARE @Dept_name nvarchar(20)
  87. SET @Dept_name = N'MIS'
  88. ;WITH
  89. DEPTS AS(
  90. -- 定位点成员
  91. SELECT * FROM Dept
  92. WHERE name = @Dept_name
  93. UNION ALL
  94. -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
  95. SELECT A.*
  96. FROM Dept A, DEPTS B
  97. WHERE A.parent_id = B.id
  98. )
  99. SELECT * FROM DEPTS
  100. GO
  101.  
  102. -- 删除演示环境
  103. DROP TABLE Dept
  104.  
  105. ----CTE的综合应用
  106.  
  107. USE tempdb
  108. GO
  109.  
  110. -- 建立演示环境
  111. CREATE TABLE Dept(
  112. id int PRIMARY KEY,
  113. parent_id int,
  114. name nvarchar(20))
  115. INSERT Dept
  116. SELECT 0, 0, N'<全部>' UNION ALL
  117. SELECT 1, 0, N'财务部' UNION ALL
  118. SELECT 2, 0, N'行政部' UNION ALL
  119. SELECT 3, 0, N'业务部' UNION ALL
  120. SELECT 4, 0, N'业务部' UNION ALL
  121. SELECT 5, 4, N'销售部' UNION ALL
  122. SELECT 6, 4, N'MIS' UNION ALL
  123. SELECT 7, 6, N'UI' UNION ALL
  124. SELECT 8, 6, N'软件开发' UNION ALL
  125. SELECT 9, 8, N'内部开发'
  126. GO
  127.  
  128. -- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数
  129. DECLARE @Dept_name nvarchar(20)
  130. SET @Dept_name = N'MIS'
  131. ;WITH
  132. DEPTS AS( -- 查询指定部门及其下的所有子部门
  133. -- 定位点成员
  134. SELECT * FROM Dept
  135. WHERE name = @Dept_name
  136. UNION ALL
  137. -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
  138. SELECT A.*
  139. FROM Dept A, DEPTS B
  140. WHERE A.parent_id = B.id
  141. ),
  142. DEPTCHILD AS( -- 引用第1CTE,查询其每条记录对应的部门下的所有子部门
  143. SELECT
  144. Dept_id = P.id, C.id, C.parent_id
  145. FROM DEPTS P, Dept C
  146. WHERE P.id = C.parent_id
  147. UNION ALL
  148. SELECT
  149. P.Dept_id, C.id, C.parent_id
  150. FROM DEPTCHILD P, Dept C
  151. WHERE P.id = C.parent_id
  152. ),
  153. DEPTCHILDCNT AS( -- 引用第2CTE, 汇总得到各部门下的子部门数
  154. SELECT
  155. Dept_id, Cnt = COUNT(*)
  156. FROM DEPTCHILD
  157. GROUP BY Dept_id
  158. )
  159. SELECT -- JOIN1,3CTE,得到最终的查询结果
  160. D.*,
  161. ChildDeptCount = ISNULL(DS.Cnt, 0)
  162. FROM DEPTS D
  163. LEFT JOIN DEPTCHILDCNT DS
  164. ON D.id = DS.Dept_id
  165. GO
  166.  
  167. -- 删除演示环境
  168. DROP TABLE Dept

SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)的更多相关文章

  1. SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)

    --------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...

  2. JQuery/JS插件 jsTree加载树,预先加载,初始化时加载前三级节点,当展开第三级节点时 就加载该节点下的所有子节点

    jsTree加载树, 初始化时 加载前三级节点, 当展开第三级节点时 就加载该节点下的所有子节点 html: <!DOCTYPE html> <html> <head&g ...

  3. easyui Tree模拟级联勾选cascadeCheck,节点选择,父节点自动选中,节点取消,父节点自动取消选择,节点选择,所有子节点全部选择,节点取消,所有子节点全部取消勾选

    最近项目中用到easyui tree,发现tree控件的cascadeCheck有些坑,不像miniui 的tree控件,级联勾选符合业务需求,所以就自己重新改写了onCheck事件,符合业务需求.网 ...

  4. JS中如何删除某个父元素下的所有子元素?

    JS中如何删除某个父元素下的所有子元素?这里我介绍几种方法: 1.通过元素的 innerHTML 属性来删除 这种方式我觉得是最有方便的,直接找到你想要的父元素,直接令其 element.innerH ...

  5. sql查询当前登陆人所管理的校区下的人员

    StringBuilder sql = new StringBuilder("select accountId, concat( ',', GROUP_CONCAT(FIND_IN_SET( ...

  6. postgre 查询同表中的,该节点写的所有子节点

    SELECT catalogid, foldername, parentid, folderpath FROM public.ic_catalog; --查询同表中的,该节点写的所有子节点 WITH ...

  7. [经典SQL语句]根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回

    树形表结构: id parentID isDel 1 0 0 2 1 0 3 1 1 4 2 0 5 2 0 一)根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回 ID=,需要返回的结果(条件 ...

  8. SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)

    前言 前面几节都是讲的基础内容,本节我们讲讲索引性能优化,当对大数据进行处理时首先想到的就是索引,一旦遇到这样的问题则手忙脚乱,各种查资料,为何平常不扎实基本功呢,我们由浅入深,简短的内容,深入的理解 ...

  9. 提高SQL查询效率(SQL优化)

    要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359   我们要做到不但会写SQL,还要做到 ...

随机推荐

  1. Redis 3.2.8 集群模式+Sentinel多Master部署

    环境准备CentOS 7.3redis1 172.18.1.101:7001 masterredis2 172.18.1.102:7002 masterredis3 172.18.1.103:7003 ...

  2. Mvp快速搭建商城购物车模块

    代码地址如下:http://www.demodashi.com/demo/12834.html 前言: 说到MVP的时候其实大家都不陌生,但是涉及到实际项目中使用,还是有些无从下手.因此这里小编带着大 ...

  3. 单例模式获取JDBC连接

    package com.jdbc.test; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...

  4. Predix中模型设计

    GE的Predix使用了图形数据库作为Asset存储,用以解决传统RDBMS系统中扩展性差,不支持行的动态定义问题. 对于实体,或者Asset来说,由如下几个方面表述: ID: Ties everyt ...

  5. Linux操作系统桌面环境GNOME和KDE的切换

    一.设置GNOME或者KDE为默认的启动桌面环境 方法1:修改/etc/sysconfig/desktop,根据需要将“DESKTOP”后面的内容改为KDE或GNOME. 方法2:在当前用户目录下建立 ...

  6. Redis源码之String操作

    0.前言 String操作是Redis操作中最基本的类型,包含get,set,mget,mset,append等等.下面我们会具体分析下一些命令的详细流程,特么简单的命令没有列出. 1.SET命令 2 ...

  7. nginx的proxy_cache缓存配置

    为什么要做web cache,我想大家最主要的是解决流量的压力.随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力.与此同时某些网站的页面 ...

  8. Atitit.导出excel报表的设计与实现java .net php 总结

    Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...

  9. Django中的request对象组成

    if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属      性 描述 path 表示提 ...

  10. angularjs 可以加入html标签方法------ng-bind-html的用法总结(1)

    本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块.(这个模块需要加载angular-sanitize.js插件) 要学习这个服务,先要了解另一个指令: n ...