树状sql--采用递归方式获取节点

创建数据库

create table City
(
id varchar(3) primary key ,
pid varchar(3) ,
name varchar(10)
)

插入数据

insert into City values(‘001‘ , null , ‘广东省‘);
insert into City values(‘002‘ , ‘001‘ , ‘广州市‘);
insert into City values(‘003‘ , ‘001‘ , ‘深圳市‘) ;
insert into City values(‘004‘ , ‘002‘ , ‘天河区‘) ;
insert into City values(‘005‘ , ‘003‘ , ‘罗湖区‘);
insert into City values(‘006‘ , ‘003‘ , ‘福田区‘) ;
insert into City values(‘007‘ , ‘003‘ , ‘宝安区‘) ;
insert into City values(‘008‘ , ‘007‘ , ‘西乡镇‘) ;
insert into City values(‘009‘ , ‘007‘ , ‘龙华镇‘);
insert into City values(‘010‘ , ‘007‘ , ‘松岗镇‘);

insert into City values(‘011‘ , null , ‘中国‘);

递归子节点的存储过程:

create proc ProcCity
@id nvarchar(36)
as
begin
with cte as
(
select a.id,a.name,a.pid from City a where [email protected]
union all
select k.id,k.name,k.pid from City k inner join cte c on c.id = k.pid
)select * from cte
end

获取深圳以及深圳的所有区:exec ProcCity ‘003‘

递归父节点的存储过程:

create proc ProcCity
@id nvarchar(36)
as
begin
with cte as 

select a.id,a.name,a.pid from City a where [email protected] 
union all 
select k.id,k.name,k.pid from City k inner join cte c on k.id = c.pid 
)select * from cte 
end

获取深圳以及深圳的所有父节点:exec ProcCity ‘003‘

时间: 2024-08-03 14:18:55

树状sql--采用递归方式获取节点的相关文章

采用递归方式查询某目录下的所有文件

private void DirPathAll(string dirpath) { //本目录下的文件 var paths = Directory.GetFiles(dirpath); foreach (var path in paths) { Application.DoEvents(); listBox1.Items.Add(path); } //所有子目录下的文件 var files = Directory.GetDirectories(dirpath); //获取所有子目录 foreac

java File类 打印目录树状结构(递归)

import java.io.File; /** * 递归遍历 * */ public class FieTree { public static void main(String[] args) { File f = new File("D:/java笔记"); printFile(f,0); } static void printFile(File file,int level){ for(int i=0;i<level;i++){ System.out.print(&quo

二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树第K层的节点数 (1)递归方式 给定根节点pRoot: 如

[算法 树状数组]

要学树状数组的先看懂一幅图 这就是树状数组的存储方式. 那么树状数组的优点是什么呢,允许任意修改,可快速提取出a数组内数字 据图可知 c1=a1, c2=a1+a2, c3=a3, c4=a1+a2+a3+a4, c5=a5, c6=a5+a6, c7=a7, c8=a1+a2+a3+a4+a5+a6+a7+a8, c9=a9, c10=a9+a10, c11=a11....... .c16=a1+a2+a3+a4+a5+.......+a16. 分析上面的几组式子可知,当 i 为奇数时,ci=

Opencv研读笔记:haartraining程序之cvCreateCARTClassifier函数详解(CART树状弱分类器创建)~

cvCreateCARTClassifier函数在haartraining程序中用于创建CART树状弱分类器,但一般只采用单一节点的CART分类器,即桩分类器,一个多节点的CART分类器训练耗时很多.根据自己的测试,要等差不多10分钟(2000正样本.2000负样本)才能训练完一个3节点的弱分类器,当然,总体的树状弱分类器的数目可能也会减少1/2.之所以将此函数拿出来说说,主要是因为在网上找不到针对这个函数的详细说明,同时,CART的应用十分广泛,自己也趁这个机会好好学学,把自己的一点理解分享给

hdu 5775 Bubble Sort(2016 Multi-University Training Contest 4——树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 636    Accepted Submission(s): 378 Problem Description P is a permutation of the

hdu1166:敌兵布阵(树状数组或线段树)

题目描述: 一堆废话不用看...... 输入: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50).接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数

左右值编码实现树状存储

聊聊树状结构如何在数据库中存储 昨天有人在QQ小组问起,无限分层的树状结构,数据量比较大,在一万条以上,如何设计数据库的结构.其实这是个老生常谈的问题,一般的做法是有一个pid字段,为了提高效率,还会有个FullPath字段.(一些人还设置一个层级字段,但我不知道这个字段有何作用),FullPath字段可以用id-id-id-.这种方式拼字符串存储,这样可以方便地用 like 语句进行查询某个节点及其子节点. 曾经看到过另外一种存储方式,利用了一般树结构可以转换二叉树的这一做法,用二叉树进行存储

树状数组知识点详解

树状数组 树状数组是一种数据结构,它的作用就是优化查询和修改的操作.试想,我们假如在做一道题的时候使用裸的一维数组来存储数据,那每次区间修改需要O(1)的时间,但查询却需要O(n)的时间,针对于某些题目,数据量奇大无比,必然会TLE.所以我们使用树状数组来优化这两个操作,使得修改和查询均可以在O(logn)的时间内完成,提升效率. (这是百度百科上树状数组的图) 可以直观地看出树状数组是个什么模式,是的,这就是一棵树,而这棵树上每个节点存储的数据就是它所有儿子节点的数据和.所以我们就可以在树上做