SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)
- -->Title:Generating test data
- -->Author:wufeng4552
- -->Date :2009-09-30 08:52:38
- set nocount on
- if object_id('tb','U')is not null drop table tb
- go
- create table tb(ID int, ParentID int)
- insert into tb select 1,0
- insert into tb select 2,1
- insert into tb select 3,1
- insert into tb select 4,2
- insert into tb select 5,3
- insert into tb select 6,5
- insert into tb select 7,6
- -->Title:查找指定節點下的子結點
- if object_id('Uf_GetChildID')is not null drop function Uf_GetChildID
- go
- create function Uf_GetChildID(@ParentID int)
- returns @t table(ID int)
- as
- begin
- insert @t select ID from tb where ParentID=@ParentID
- while @@rowcount<>0
- begin
- insert @t select a.ID from tb a inner join @t b
- on a.ParentID=b.id and
- not exists(select 1 from @t where id=a.id)
- end
- return
- end
- go
- select * from dbo.Uf_GetChildID(5)
- /*
- ID
- -----------
- 6
- 7
- */
- -->Title:查找指定節點的所有父結點
- if object_id('Uf_GetParentID')is not null drop function Uf_GetParentID
- go
- create function Uf_GetParentID(@ID int)
- returns @t table(ParentID int)
- as
- begin
- insert @t select ParentID from tb where ID=@ID
- while @@rowcount!=0
- begin
- insert @t select a.ParentID from tb a inner join @t b
- on a.id=b.ParentID and
- not exists(select 1 from @t where ParentID=a.ParentID)
- end
- return
- end
- go
- select * from dbo.Uf_GetParentID(2)
- /*
- ParentID
- -----------
- 1
- 0
- */
- USE tempdb
- GO
- -- 建立演示环境
- CREATE TABLE Dept(
- id int PRIMARY KEY,
- parent_id int,
- name nvarchar(20))
- INSERT Dept
- SELECT 0, 0, N'<全部>' UNION ALL
- SELECT 1, 0, N'财务部' UNION ALL
- SELECT 2, 0, N'行政部' UNION ALL
- SELECT 3, 0, N'业务部' UNION ALL
- SELECT 4, 0, N'业务部' UNION ALL
- SELECT 5, 4, N'销售部' UNION ALL
- SELECT 6, 4, N'MIS' UNION ALL
- SELECT 7, 6, N'UI' UNION ALL
- SELECT 8, 6, N'软件开发' UNION ALL
- SELECT 9, 8, N'内部开发'
- GO
- -- 查询指定部门下面的所有部门
- DECLARE @Dept_name nvarchar(20)
- SET @Dept_name = N'MIS'
- ;WITH
- DEPTS AS(
- -- 定位点成员
- SELECT * FROM Dept
- WHERE name = @Dept_name
- UNION ALL
- -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
- SELECT A.*
- FROM Dept A, DEPTS B
- WHERE A.parent_id = B.id
- )
- SELECT * FROM DEPTS
- GO
- -- 删除演示环境
- DROP TABLE Dept
- ----CTE的综合应用
- USE tempdb
- GO
- -- 建立演示环境
- CREATE TABLE Dept(
- id int PRIMARY KEY,
- parent_id int,
- name nvarchar(20))
- INSERT Dept
- SELECT 0, 0, N'<全部>' UNION ALL
- SELECT 1, 0, N'财务部' UNION ALL
- SELECT 2, 0, N'行政部' UNION ALL
- SELECT 3, 0, N'业务部' UNION ALL
- SELECT 4, 0, N'业务部' UNION ALL
- SELECT 5, 4, N'销售部' UNION ALL
- SELECT 6, 4, N'MIS' UNION ALL
- SELECT 7, 6, N'UI' UNION ALL
- SELECT 8, 6, N'软件开发' UNION ALL
- SELECT 9, 8, N'内部开发'
- GO
- -- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数
- DECLARE @Dept_name nvarchar(20)
- SET @Dept_name = N'MIS'
- ;WITH
- DEPTS AS( -- 查询指定部门及其下的所有子部门
- -- 定位点成员
- SELECT * FROM Dept
- WHERE name = @Dept_name
- UNION ALL
- -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
- SELECT A.*
- FROM Dept A, DEPTS B
- WHERE A.parent_id = B.id
- ),
- DEPTCHILD AS( -- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门
- SELECT
- Dept_id = P.id, C.id, C.parent_id
- FROM DEPTS P, Dept C
- WHERE P.id = C.parent_id
- UNION ALL
- SELECT
- P.Dept_id, C.id, C.parent_id
- FROM DEPTCHILD P, Dept C
- WHERE P.id = C.parent_id
- ),
- DEPTCHILDCNT AS( -- 引用第2个CTE, 汇总得到各部门下的子部门数
- SELECT
- Dept_id, Cnt = COUNT(*)
- FROM DEPTCHILD
- GROUP BY Dept_id
- )
- SELECT -- JOIN第1,3个CTE,得到最终的查询结果
- D.*,
- ChildDeptCount = ISNULL(DS.Cnt, 0)
- FROM DEPTS D
- LEFT JOIN DEPTCHILDCNT DS
- ON D.id = DS.Dept_id
- GO
- -- 删除演示环境
- DROP TABLE Dept
SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)的更多相关文章
- SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)
--------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...
- JQuery/JS插件 jsTree加载树,预先加载,初始化时加载前三级节点,当展开第三级节点时 就加载该节点下的所有子节点
jsTree加载树, 初始化时 加载前三级节点, 当展开第三级节点时 就加载该节点下的所有子节点 html: <!DOCTYPE html> <html> <head&g ...
- easyui Tree模拟级联勾选cascadeCheck,节点选择,父节点自动选中,节点取消,父节点自动取消选择,节点选择,所有子节点全部选择,节点取消,所有子节点全部取消勾选
最近项目中用到easyui tree,发现tree控件的cascadeCheck有些坑,不像miniui 的tree控件,级联勾选符合业务需求,所以就自己重新改写了onCheck事件,符合业务需求.网 ...
- JS中如何删除某个父元素下的所有子元素?
JS中如何删除某个父元素下的所有子元素?这里我介绍几种方法: 1.通过元素的 innerHTML 属性来删除 这种方式我觉得是最有方便的,直接找到你想要的父元素,直接令其 element.innerH ...
- sql查询当前登陆人所管理的校区下的人员
StringBuilder sql = new StringBuilder("select accountId, concat( ',', GROUP_CONCAT(FIND_IN_SET( ...
- postgre 查询同表中的,该节点写的所有子节点
SELECT catalogid, foldername, parentid, folderpath FROM public.ic_catalog; --查询同表中的,该节点写的所有子节点 WITH ...
- [经典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=,需要返回的结果(条件 ...
- SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)
前言 前面几节都是讲的基础内容,本节我们讲讲索引性能优化,当对大数据进行处理时首先想到的就是索引,一旦遇到这样的问题则手忙脚乱,各种查资料,为何平常不扎实基本功呢,我们由浅入深,简短的内容,深入的理解 ...
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
随机推荐
- 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 ...
- Mvp快速搭建商城购物车模块
代码地址如下:http://www.demodashi.com/demo/12834.html 前言: 说到MVP的时候其实大家都不陌生,但是涉及到实际项目中使用,还是有些无从下手.因此这里小编带着大 ...
- 单例模式获取JDBC连接
package com.jdbc.test; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...
- Predix中模型设计
GE的Predix使用了图形数据库作为Asset存储,用以解决传统RDBMS系统中扩展性差,不支持行的动态定义问题. 对于实体,或者Asset来说,由如下几个方面表述: ID: Ties everyt ...
- Linux操作系统桌面环境GNOME和KDE的切换
一.设置GNOME或者KDE为默认的启动桌面环境 方法1:修改/etc/sysconfig/desktop,根据需要将“DESKTOP”后面的内容改为KDE或GNOME. 方法2:在当前用户目录下建立 ...
- Redis源码之String操作
0.前言 String操作是Redis操作中最基本的类型,包含get,set,mget,mset,append等等.下面我们会具体分析下一些命令的详细流程,特么简单的命令没有列出. 1.SET命令 2 ...
- nginx的proxy_cache缓存配置
为什么要做web cache,我想大家最主要的是解决流量的压力.随着网站流量的提升,如果只是单台机器既处理静态文件,又处理动态脚本,显然效率很难上升,不能处理日益上涨的流量压力.与此同时某些网站的页面 ...
- Atitit.导出excel报表的设计与实现java .net php 总结
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- Django中的request对象组成
if request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属 性 描述 path 表示提 ...
- angularjs 可以加入html标签方法------ng-bind-html的用法总结(1)
本篇主要讲解angular中的$sanitize这个服务.此服务依赖于ngSanitize模块.(这个模块需要加载angular-sanitize.js插件) 要学习这个服务,先要了解另一个指令: n ...