- 浏览: 52397 次
- 性别:
- 来自: 珠海
文章分类
最新评论
ORACLE - 树结构查询
如果看到下面这种表结构,并想获取到他们之间的树机构关系,ORACLE中有很好的函数可以快速解决。
XJDW SJDW
==========
117 119
110 118
110 117
122 123
114 110
114 115
121 122
109 111
109 112
113 116
120 121
113 114
下面有详细的说明:
树结构查询
ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型结构的联系。例如,我们现在讨论雇员信息表EMP,其中含有雇员编号(EMPNO)和经理(MGR)两例,通过这两列反映出来的就是雇员之间领导和被领导的关系。有些雇员领导另一些雇员,有些雇员被领导,还有些雇员领导一些人又被别人领导,他们之间的这种关系就是一种树结构,图1.1表示了EMP表雇员间的这种树结构。
MGR=7839
MGR=7839 MGR=7839
EMPNO=7566
EMPNO=9698 EMPNO=7782
JONES
BLAKE
CLARK
MGR=7566 MGR=7566 MGR=7698 MGR=7698 MGR=7698
MGR=7698 MGR=7698 MGR=7782
SCOTT FORD ALLEN
WARD MARTIN TURNER JAMES MILLER
EMPNO=7788
EMPNO=7902 EMPNO=7499 EMPNO=7521 EMPNO=9654 EMPNO=7844 EMPNO=7900
EMPNO=7934
MGR=7788 MGR=7902
ADAMS
SMITH
EMPNO=7876 EMPNO=7369
图1.1 EMP表树结构图
在这个树结构中,如果一个节点有直接的下属节点(如图中的JONES 有碍SCOTT
和FORD),那么称该节点是下属节点的父节点,下属节点为该节点的子节点。通过雇员的EMPNO和MGR可以看出他们之间的父子节点关系,父节点的EMPNO与子节点的MGR相同。在树结构中,有且仅有一个节点无父节点,如图中的KING,该节点被称为根节点。从图上的标记可以看出,只有KING的MGR为空值。除根节点外,任何节点只有一个父节点,有一个,多个或没有子节点。
早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
第一步:从根节点开始;
第二步:访问该节点;
第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
第四步:若该节点为根节点,则访问完毕,否则执行第五步;
第五步:返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
1.
树结构的描述
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如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 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
例1
以树结构方式显示EMP表的数据。
SQL> SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME=’KING’;
EMPNO
ENAME MGR
7839 KING
7566
JONES 7839
7788 SCOTT
7566
7876 ADAMS 7788
7902
FORD 7566
7369 SMITH
7902
7698 BLAKE 7839
7499
ALLEN 7698
7521 WARD
7698
7654 MARTIN 7698
7844 TURNER
7698
7900 JAMES 7698
7782
CLARK 7839
7934 MILLER 7782
14 rows
selected.
2.
关于PRIOR
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
PRIOR被置于CONNECT
BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:
CONNECT
BY PRIOR EMPNO=MGR
PIROR运算符被置于CONNECT BY
子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
CONNECT
BY EMPNO=PRIOR MGR
在这种方式中也应指定一个开始的节点。
例2 从SMITH节点开始自底向上查找EMP的树结构。
SQL>SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT
BY EMPNO=PRIOR MGR
START WITH ENAME=’SMITH’;
EMPNO ENAME MGR
-------------------------
7369 SMITH
7902
7902 FORD 7566
7566 JONES 7839
7839
KING
4 rows
selected.
在这种自底向上的查找过程中,只有树中的一枝被显示,这是因为,在树结构中每一个节点只允许有一个父节点,其查找过程是从开始节点起,找到其父节点,再由其父节点向上,找父节点的父节点。这样一直找到根节点为止,结果就是树中一枝的数据。
备注:例2的另外一种写法
SELECT
EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR MGR=EMPNO
START WITH ENAME='
SMITH ';
3. 定义查找起始节点
在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。
例3
查找JONES直接或间接领导的所有雇员信息。
SQL>SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START
WITH ENAME=‘JONES’;
EMPNO
ENAME MGR
--------------------------
7566 JONES 7839
7788 SCOTT 7566
7876
ADAMS 7788
7902 FORD
7566
7369 SMITH
7902
5 rows selected.
START WITH
不但可以指定一个根节点,还可以指定多个根节点。
例4 查找由FORD和BLAKE 领导的所有雇员的信息。
SQL>SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME IN
(’FORD’,’BLAKE’);
EMPNO ENAME
MGR
--------------------------
7698
BLAKE 7839
7499 ALLEN
7698
7521 WARD
7698
7654 MARTIN 7698
7844
TURNER 7698
7900 JAMES
7698
7902 FORD 7566
7369 SMITH 7902
8 rows
selected.
在自底向上查询树结构时,也要指定一个开始节点,以此开始向上查找其父节点,直至找到根节点,其结果将是结构树中的一枝数据。
4.使用LEVEL
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2,
依此类推。图1.2就表示了树结构的层次。
层号
KING 1
JONES
BLAKE CLARK2
MILLER
3
SCOTTFORD ALLEN WARD MARTIN TURNER
JAMES
ADAMSSMITH
4
图案1.2 EMP表树结构层次图
在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。
例5显示EMP表中的各行数据及层号。
SQL>SELECT LEVEL,EMPNO,MGR
FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH ENAME=‘KING’;
LEVEL EMPNO ENAME
MGR
1 7839 KING
2 7566 JONES 7839
3
7788 SCOTT 7566
4 7876
ADAMS 7788
3 7902
FORD 7566
4 7369 SMITH
7902
2 7698 BLAKE
7839
3 7499 ALLEN 7698
3
7521 WARD 7698
3 7654
MARTIN 7698
3 7844 TURNER
7698
3 7900 JAMES
7698
2 7782 CLARK 7839
3
7934 MILLER 7782
14 rows
selected.
伪列LEVEL为数值型,可以在SELECT 命令中用语各种计算机。
例6
使用LEVEL改变查询结果的显示形式。
SQL>COLUMN EMPLOYEE FORMAT A20
SQL> SELECT
EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR
FROM EMP
CONNECT
BY PRIORY EMPNO=EMR
START WITH ENAME=’KING’;
EMPNO
EMPLOYEE MGR
7840 KING
7566
JONES 7839
7788
SCOTT 7566
7876 ADAMS
7788
7902 FORD
7566
7369 SMITH 7902
7698
BLAKE 7839
7499
ALLEN 7698
7521 WARD
7698
7654 MARTIN
7698
7844 TURNER 7698
7900
JAMES 7698
7782
CLARK 7839
7934 MILLER
7782
14 rows
selected.
在SELECT使用了函数RPAD,该函数表示以LEVEL*3个空格进行填充,由于不同行处于不同的节点位置,具有不同的LEVEL值,因此填充的空格数将根据各自的层号确定,空格再与雇员名字拼接,结果显示出这种层次关系,也就是说其雇员名字右侧填充的空格数与它的层数有关。
5.节点和分支的裁剪
在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
SQL>COLUMN
EMPLOYEE FORMAT A20
SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME
EMPLOYEE,MGR
FROM EMP
WHERE ENAME!=’SCOTT’
CONNECT BY PRIORY EMPNO=EMR
START WITH
ENAME=’KING’;
EMPNO EMPLOYEE
MGR
7841 KING
7566 JONES
7839
7876 ADAMS
7788
7902 FORD 7566
7369
SMITH 7902
7698
BLAKE 7839
7499 ALLEN
7698
7521 WARD
7698
7654 MARTIN 7698
7844
TURNER 7698
7900
JAMES 7698
7782 CLARK
7839
7934 MILLER
7782
13 rows selected.
在这个查询中,仅剪去了树中单个节点SCOTT。若希望剪去树结构中的某个分支,则要用CONNECT BY
子句。CONNECT BY
子句是限定树型结构中的整个分支,既要剪除分支上的单个节点,也要剪除其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
例8.显示KING领导下的全体雇员信息,除去SCOTT领导的一支。
SQL>
SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME EMPLOYEE,MGR
FROM EMP
CONNECT BY PRIORY EMPNO=EMR
AND ENAME!=’SCOTT’
START WITH ENAME=’KING’;
EMPNO EMPLOYEE
MGR
7842 KING
7566 JONES
7839
7902 FORD
7566
7369 SMITH 7902
7698
BLAKE 7839
7499
ALLEN 7698
7521 WARD
7698
7654 MARTIN
7698
7844 TURNER 7698
7900
JAMES 7698
7782
CLARK 7839
7934 MILLER
7782
12 rows
selected.
这个查询结果就与例7不同,除了剪去单个节点SCOTT外,还将SCOTT的子节点ADAMS剪掉,即把SCOTT这个分支剪掉了。
当然WHERE子句可以和CONNECT
BY子句联合使用,这样能够同时剪掉单个节点和树中的某个分支。
例9.显示KING领导全体雇员信息,除去雇员SCOTT,以及BLAKE领导的一支。
SQL>COLUMN
EMPLOYEE FORMAT A20
SQL> SELECT EMPNO,RPAD(‘ ‘,LEVEL*3) ||ENAME
EMPLOYEE,MGR
FROM EMP
WHERE ENAME!=’SCOTT’
CONNECT BY PRIORY EMPNO=EMR
AND ENAME!=’BLAKE’
START WITH ENAME=’KING’;
EMPNO EMPLOYEE
MGR
7843 KING
7566 JONES
7839
7876 ADAMS
7788
7902 FORD 7566
7369
SMITH 7902
7782
CLARK 7839
7934 MILLER
7782
7 rows selected.
6.排序显示
象在其它查询中一样,在树结构查询中也可以使用ORDER BY
子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。
例10 以EMPNO的顺序显示树结构EMP 中的数据。
SQL>
SELECT EMPNO,ENAME,MGR
FROM EMP
CONNECT BY PRIOR
EMPNO=MGR
START WITH ENAME=’KING’;
ORDER BY
EMPNO;
EMPNO ENAME MGR
7369
SMITH 7902
7499 ALLEN
7698
7521 WARD 7698
7566
JONES 7839
7654 MARTIN 7698
7698
BLAKE 7839
7782 CLARK
7839
7788 SCOTT 7566
7839
KING
7844 TURNER 7698
7876 ADAMS
7788
7900 JAMES 7698
7902
FORD 7566
7934 MILLER 7782
14
rows selected.
在使用SELECT 语句来报告树结构报表时应当注意,CONNECT
BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。
sys_connect_by_path函数
个人觉得这个函数其实很好用,sys_connect_by_path(字段名, 2个字段之间的连接符号),注意这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,',')。
还有,这个函数使用之前必须先建立一个树,否则无用。
举个例子:
目的:将num值相等的项目写成 seq1,seq2,seq3,……的形式
(SELECT num,REPLACE(MAX(sql0), ';', ',')
FROM (SELECT num, sys_connect_by_path(sql1, ';') AS sql0
FROM (SELECT num, sql1, rn, lead(rn) over(PARTITION BY num ORDER BY rn) rn1
FROM (SELECT num, sql1, row_number() over(ORDER BY num, sql1 DESC) rn FROM tlsbk))
START WITH num = '1' AND rn1 IS NULL
CONNECT BY rn1 = PRIOR rn));
结果:
num REPLACE(MAX(sql0), ';', ',')
--------------------------------------------------------
1 sql0,sql1,sql2
2 sql20,sql21,sql23,sql24,sql25
3 sql30,sql31,sql32,sql33,sql34,sql35,sql36
树结构和它的专用函数SYS_CONNECT_BY_PATH(网摘:http://blog.oracle.com.cn/html/83/t-122083.html)
简单的树型结构
关于树的普通应用
学习了下这个函数, 用ORGINDUSTRIES的表做了个测试:
正常的树型结构
select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=1
connect by pindid=prior indid
结果显示如下
Indlevelindid pindid
服装与服饰 1 1 0
服装 2 2 1
女装 3 3 2
倒型树
下面这个例子是个”倒数”—倒过来的树型结构
select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=20
connect by indid=prior pindid;
这是标准结果:
Indlevel indid pindid
二手服装 3 20 2
服装 2 2 1
服装与服饰 1 1 0
结论
无论正树还是倒树, 关键就在于connect by的条件.
正树:必须是‘父’= prior ‘子’
倒树:必须是‘子’= prior ‘父’
树型结构的条件过滤
采用树型结构的话, 如果我们想将树上的一个分支砍掉.将分支后面的结构都抛弃掉, 这个可以实现麽?当然可以。 但是不是用where, where条件只能去除单一的条件。
所以, 这种树型的过滤条件就需要加在connect by上面。
测试如下:由于用真实环境比较贴近实际,所以提前用下SYS_CONNECT_BY_PATH函数来显示下环境
不加任何条件的环境:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
start with areaname='中国大陆'
connect by parentareaid=prior areaid
结果:
1 中国大陆,中国大陆
2 北京 ,中国大陆,北京
3 北京 ,中国大陆,北京,北京
4 东城区 ,中国大陆,北京,东城区
5 西城区 ,中国大陆,北京,西城区
22 广东 ,中国大陆,广东
23 广州 ,中国大陆,广东,广州
24 汕尾 ,中国大陆,广东,汕尾
25 潮阳 ,中国大陆,广东,潮阳
46 上海 ,中国大陆,上海
47 上海 ,中国大陆,上海,上海
48 黄浦区 ,中国大陆,上海,黄浦区
49 闸北区 ,中国大陆,上海,闸北区
加了where过滤条件的SQL:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaid
结果为:
2 北京 ,中国大陆,北京
3 北京 ,中国大陆,北京,北京
4 东城区 ,中国大陆,北京,东城区
5 西城区 ,中国大陆,北京,西城区
22 广东 ,中国大陆,广东
23 广州 ,中国大陆,广东,广州
24 汕尾 ,中国大陆,广东,汕尾
25 潮阳 ,中国大陆,广东,潮阳
46 上海 ,中国大陆,上海
47 上海 ,中国大陆,上海,上海
48 黄浦区 ,中国大陆,上海,黄浦区
49 闸北区 ,中国大陆,上海,闸北区
结论:去掉了“1 中国大陆,中国大陆”数据
加了connect by的过滤条件:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaidand areaname<>'广东'
结果为:
2 北京 ,中国大陆,北京
3 北京 ,中国大陆,北京,北京
4 东城区 ,中国大陆,北京,东城区
5 西城区 ,中国大陆,北京,西城区
46 上海 ,中国大陆,上海
47 上海 ,中国大陆,上海,上海
48 黄浦区 ,中国大陆,上海,黄浦区
49 闸北区 ,中国大陆,上海,闸北区
结论:去掉了整个广东的分支,在结果集中只有北京和上海
SYS_CONNECT_BY_PATH函数
采用SYS_CONNECT_BY_PATH函数为:
select industry,sys_connect_by_path(industry,'/')
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;
结果为:
女装 /女装
服装 /女装/服装
服装与服饰 /女装/服装/服装与服饰
这样的话, 就可以实现, 树结构的结果集的单行拼接:
我们只需要取最大的字段就OK了
测试如下:
select max(sys_connect_by_path(industry,'/'))
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;
结果为:
/女装/服装/服装与服饰
复杂的树型结构――多列变单列
树型结构也分单树和多树(我的称呼,实际上就是指单支和多支)
对于下面的这种情况, 我们必须要构造的树就属于单支树。
原始环境
环境如下:
select * from test;
结果为:
1 n1
1 n2
1 n3
1 n4
1 n5
3 t1
3 t2
3 t3
3 t4
3 t5
3 t6
2 m1
造树
脚本如下:
select no,q,
no+row_number() over( order by no) rn,
row_number() over(partition by no order by no) rn1
from test
结果如下:
NoQRN RN1
1 n1 2 1
1 n2 3 2
1 n3 4 3
1 n4 5 4
1 n5 6 5
2 m1 8 1
3 t1 10 1
3 t2 11 2
3 t3 12 3
3 t4 13 4
3 t5 14 5
3 t6 15 6
每列的目的是:
RN1列主要的目的是分组, 按照value值‘1’,我们可以start with使用它。
RN列主要用来做connect by使用。 实际上它就是我们要的树。
第一个支: 2,3,4,5,6
第二个支: 8
第三个支: 10,11,12,13,14,15
中间为什么要断掉:7,9目的就是为了区别每个分支。 到后面看具体的SQL,就明白这里的说法了。
杀手锏
既然我们有了树, 就可以使用树型函数SYS_CONNECT_BY_PATH和connect by啦,来拼接我们所需要的多列值。
脚本如下:
select no,sys_connect_by_path(q,',')
from (
select no,q,
no+row_number() over( order by no) rn,
row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn
结果为:
1 ,n1
1 ,n1,n2
1 ,n1,n2,n3
1 ,n1,n2,n3,n4
1 ,n1,n2,n3,n4,n5
2 ,m1
3 ,t1
3 ,t1,t2
3 ,t1,t2,t3
3 ,t1,t2,t3,t4
3 ,t1,t2,t3,t4,t5
3 ,t1,t2,t3,t4,t5,t6
终极武器
最终我们要的值,是单列值, 其实想想, 也就是最长的一行咯。 那么就好办了。 我们直接GROUP BY ,然后取MAX值。
脚本如下:
select no,max(sys_connect_by_path(q,','))
from (
select no,q,
no+row_number() over( order by no) rn,
row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn
group by no
结果为:
1 ,n1,n2,n3,n4,n5
2 ,m1
3 ,t1,t2,t3,t4,t5,t6
如果觉得前面的‘,’不好看,可以使用ltrim去掉。 或者用substr也可以。
如下:
ltrim(max(sys_connect_by_path(q,',')),',')
或者
substr(max(sys_connect_by_path(q,',')),2)
相关推荐
Oracle 基于树结构查询详解 Oracle 基于树结构查询是一种高效的查询方式,特别在处理树型结构数据时。树结构查询可以快速地检索树型结构数据,并且可以根据实际需求进行查询优化。 树结构查询的基本概念: 树结构...
例如,它可以将每个节点的路径作为字符串返回,便于理解和分析树结构。 在实际应用中,例如组织结构的展示,我们可以创建一个包含部门信息的表`SYS_DEPT`,其中`dept_id`为主键,`par_dept_id`表示父级部门ID,以此...
Oracle树形结构查询,层次查询,hierarchical retrieval Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的...
Oracle 查询树形结构 Oracle 查询树形结构是一种特殊的查询方式,它可以将树形结构的数据从 Oracle 数据库中检索出来。这种结构广泛应用于各种应用系统中,例如管理系统、文件系统、组织结构等。 在 Oracle 中,...
在处理复杂的数据查询时,尤其在数据具有层次性或树状结构的情况下,Oracle提供了一种高效的方法——树结构查询。本篇文章将深入探讨Oracle如何处理这类查询,并通过一个具体的文档案例进行解析。 首先,我们要了解...
树结构查询在Oracle中可以通过`CONNECT BY`和`START WITH`子句实现。`CONNECT BY`子句用于定义层次关系,它表明数据将按照层次顺序检索,通过指定的列(如EMPNO和MGR)连接形成树状结构。`PRIOR`关键字用于指示父...
Oracle 数据库树形结构用法总结,例如SYS_CONNECT_BY_PATH 、START WITH . . . CONNECT BY . . .等具体语法介绍
一、Oracle树结构查询基础 1.1 连接查询(Connect By) Oracle的Connect By子句是处理层次数据的核心工具。它允许我们指定一个层级关系的起始点,并按照指定的规则递归地遍历整个树。基本语法如下: ```sql ...
在Oracle数据库中,进行树状结构查询是一种常见且强大的功能,尤其当数据具有层次或层级关系时,如组织架构、产品分类、文件系统等。本文将深入探讨如何在Oracle中执行树状结构查询,理解其背后的逻辑,以及如何利用...
oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询
4. SQL查询:SQL(结构化查询语言)是与Oracle交互的主要工具,包括SELECT语句用于查询数据,INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据。 5. 视图:视图是从一个或多个表中创建的虚拟表,它不...
6. **索引**:Oracle支持多种类型的索引,如B树索引、位图索引、函数索引等,它们加速了数据查询速度。 7. **备份与恢复**:Oracle提供完整备份、增量备份、逻辑备份等多种备份策略,并有RMAN(恢复管理器)工具...
2. **SQL语言**:Oracle支持结构化查询语言(SQL),用于查询、插入、更新和删除数据库中的数据。学习者需要熟悉SQL的基本语法,包括DML(Data Manipulation Language)和DDL(Data Definition Language)操作。 3....
PL/SQL是Oracle特有的过程化语言,结合了SQL的查询功能和传统编程语言的控制结构。学习者应掌握如何编写存储过程、函数、触发器,以及如何处理异常和事务。 七、数据库安全 Oracle提供了丰富的权限和角色机制来保护...
通过指定起始节点(START WITH)和连接条件(CONNECT BY),我们可以构建出一个递归查询,从而获取整个树结构。 例如,假设我们有一个部门表DEPARTMENTS,包含ID(主键)、PARENT_ID(父ID)和NAME(部门名称)字段...
1. **Oracle数据库结构**:Oracle数据库由多个组件组成,包括表空间、数据文件、控制文件、重做日志文件等。表空间是存储数据的主要单位,数据文件则实际存储了数据库的数据。控制文件记录了数据库的元数据,重做...
Oracle 数据库在处理树形数据结构时,提供了一...例如,对于大型树结构,可能需要考虑索引、并行查询、分区等优化手段。同时,理解这些查询如何工作,以及它们在不同情况下的表现,对于数据库设计和查询优化至关重要。
`START WITH`子句用于指定查询的起始节点,也就是树结构中的根节点或者你想要从哪个节点开始遍历。在给定的例子中,如果我们要从ID为7839的员工(假设是经理)开始查找其下属员工,`START WITH`会这样写:`START ...
- 层次树查询用于处理具有层次结构的数据,如组织架构、产品分类等。 **7. Mergeinto应用** - Mergeinto是一个强大的DML语句,用于插入或更新数据。 **8. Truncatetable** - TRUNCATE TABLE命令用于清空表中的所有...
2. **PL/SQL**:Oracle的Procedural Language/SQL是一种过程化语言,结合了SQL的查询能力与编程语言的控制结构。PL/SQL可以创建存储过程、函数、触发器等,实现更复杂的业务逻辑。 3. **索引**:Oracle支持B树索引...