请教:仅在SQL中怎样实现二叉树遍历非递归实现查询记录

博客分类:
Oracle Connect By用法
(数据库中树结构的各种遍历)
oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,
connect by
是结构化查询中用到的,
其基本语法是:
select ... from &TableName&where &Conditional-1&start
with &Conditional-2&connect by &Conditional-3&;
&Conditional-1&:过滤条件,用于对返回的所有记录进行过滤。&Conditional-2&:是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。&Conditional-3&:是连接条件,其中用PRIOR表示上一条记录,比如
CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id
是本条记录的parent_id,即本记录的父亲是上一条记录。 早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:第一步:从根节点开始;第二步:访问该节点;第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;第四步:若该节点为根节点,则访问完毕,否则执行第五步;第五步:返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
树结构的描述
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。在SELECT命令中使用CONNECT
BY 和蔼START WITH 子句可以查询表中的树型结构关系。其命令格式如下:SELECT 。。。CONNECT BY {PRIOR
列名1=列名2|列名1=PRIOR 裂名2}[START WITH];其中:CONNECT
BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START
WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。START WITH:
不但可以指定一个根节点,还可以指定多个根节点。
例1 、以树结构方式显示EMP表的数据。
SQL& SELECT EMPNO,ENAME,MGR
CONNECT BY PRIOR
START WITH ENAME=’KING’;
&!--[if !supportLists]--&7839&!--[endif]--&KING
14 rows selected.
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。PRIOR被置于CONNECT
BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:CONNECT BY
PRIOR EMPNO=MGR
例2 、从SMITH节点开始自底向上查找EMP的树结构。
SQL&SELECT EMPNO,ENAME,MGR
CONNECT BY EMPNO=PRIOR MGR
START WITH ENAME=’SMITH’;
—————————————————————————
4 rows selected.
PIROR运算符被置于CONNECT BY
子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:CONNECT BY
EMPNO=PRIOR MGR在这种方式中也应指定一个开始的节点。
备注:例2的另外一种写法
EMPNO,ENAME,MGR
CONNECT BY PRIOR
START WITH
ENAME=' SMITH ';
定义查找起始节点
在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。
例3、 查找JONES直接或间接领导的所有雇员信息。
SQL>SELECT EMPNO,ENAME,MGR
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME=‘JONES’;
——————————————————————————
5 rows selected.
WITH 不但可以指定一个根节点,还可以指定多个根节点。
例4、 查找由FORD和BLAKE 领导的所有雇员的信息。
SQL&SELECT EMPNO,ENAME,MGR
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME IN (’FORD’,’BLAKE’);
——————————————————————————
&!--[if !supportLists]--&7844&!--[endif]--&TURNER
8 rows selected.
4.使用LEVEL在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2,
依此类推。图1.2就表示了树结构的层次。
图案1.2 EMP表树结构层次图
例5、显示EMP表中的各行数据及层号。
SQL&SELECT LEVEL,EMPNO,MGR
BY PRIOR EMPNO=MGR
WITH ENAME=‘KING’;
伪列LEVEL为数值型,可以在SELECT 命令中用语各种计算机。
例6、使用LEVEL改变查询结果的显示形式。
SQL&COLUMN EMPLOYEE FORMAT A20
SQL& SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR
CONNECT BY PRIORY EMPNO=EMR
START WITH ENAME=’KING’;
&!--[if !supportLists]--&7839&!--[endif]--&KING
5.节点和分支的裁剪在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
SQL&COLUMN EMPLOYEE FORMAT A20
SQL& SELECT
EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR
WHERE ENAME!=’SCOTT’
CONNECT BY PRIORY EMPNO=EMR
START WITH ENAME=’KING’;
&!--[if !supportLists]--&7839&!--[endif]--&KING
6.排序显示象在其它查询中一样,在树结构查询中也可以使用ORDER
BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。
例10以EMPNO的顺序显示树结构EMP 中的数据。
SQL& SELECT EMPNO,ENAME,MGR
CONNECT BY PRIOR EMPNO=MGR
WITH ENAME=’KING’;
ORDER BY EMPNO;
&!--[if !supportLists]--&7839&!--[endif]--&KING
14 rows selected.
在使用SELECT 语句来报告树结构报表时应当注意,CONNECT BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。
例如:表结构如下:
create table t2(root_id number,id number,name
varchar(5),description varchar(10));
insert into t2(root_id,id,name,description) values(0,1,'a','aaa');insert
into t2(root_id,id,name,description) values(1,2,'a1','aaa1');insert into
t2(root_id,id,name,description) values(1,3,'a2','aaa2');insert into
t2(root_id,id,name,description) values(0,4,'b','bbb');insert into
t2(root_id,id,name,description) values(4,5,'b1','bbb1');insert into
t2(root_id,id,name,description) values(4,6,'b2','bbb2'); 如图:
1.获取完整树:
* from t2;select * from t2 start with root_id = 0 connect by prior id =
2.获取特定子树:
select * from t2 start with id = 1 connect by prior id =
from t2 start with id = 4 connect by prior id = root_
3.如果connect
by prior中的prior被省略,则查询将不进行深层递归。select * from t2 start with root_id = 0
connect by id = root_
from t2 start with id = 1 connect by id = root_
huangronaldo
浏览: 158091 次
看了你的文章顿时收益颇深
可以提问吗?htm ...
首先,第一种、第二种方法基本一样。第三种方法我正在用,大伙下不 ...
错误:“Stream closed”楼主,没找到哪里有哦错
能给我发下jar包吗,有3个没有下载到 @q ...
jodconverter-core 3.0-beta-4 Ma ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'MSSQL基础 &&&&最新内容
MSSQL基础 &&&&相关内容2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
2011年12月 总版技术专家分月排行榜第三2011年9月 总版技术专家分月排行榜第三
2011年6月 MS-SQL Server大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。查看: 1977|回复: 6
请问如何通过vba遍历一个表的每一条记录
阅读权限20
在线时间 小时
请问如何通过vba遍历一个表的每一条记录
我需要遍历每一条记录,并对其进行处理,如何做到呢
先得到记录个数,然后循环访问吗,access有没有像excel的Cells(x,y)那样的访问方法阿
阅读权限70
在线时间 小时
假如已经接上了
set cnn =createboject(&ADODB.Connection&)
Set Rst = createboject(&ADODB.Recordset&)
cnn.open ..........
rst.open Sql,Cnn
& & .movefirst
& & do until .eof
& && && &第一条记录..........
& && && &.movenext
大概像这样吧
阅读权限95
在线时间 小时
看具体目的呗,说不定不需要循环呢
阅读权限20
在线时间 小时
gufengaoyue 发表于
假如已经接上了
set cnn =createboject(&ADODB.Connection&)
你好,可以再写详细一些吗,怎么用指针&&?
比如说我的表有两个字符串字段,名字是A和B
我想通过遍历将A内容加入一个后缀,比如&_last&,然后填入对应B字段,中间部分怎么写啊
阅读权限95
在线时间 小时
UPDATE就可以了吧,你这个要求
阅读权限20
在线时间 小时
wudixin96 发表于
UPDATE就可以了吧,你这个要求
我只是简单举例,我的实际需求是遍历每一个记录,然后取出其中部分字段的内容作为另一个函数参数,执行之
阅读权限20
在线时间 小时
或者哪有例子详细介绍access中ado的简单使用,我要例子就好了
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师}

我要回帖

更多关于 实现图的遍历算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信