Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字

前期准备

分层查询(递归查询)语句: start with…connect by prior

start  with       指定层次的根部行,就是从哪里开始解析,对于真正的层次查询,(通俗解释:子句定义树查询的初始起点)这个子句是必需要有的。
connect  by prior 解释父子之间的关系(通俗解析:子句定义表中的数据是如何相互联系的)
prior             用于实现递归条件
level关键字        表示查询深度(level 表示递归的层次)

注意事项
1.level 和 connect by ,start with 合在一起,一般是用来实现递归(树)查询。
2.prior是可选项
3.connect by 和 start with 语句先后顺序不影响查询结果

代码演示操作

1.创建用户,创建表空间,赋予用户权限,用户指定表空间,切换用户
	/****************************************************/
	/********      创建用户,表空间      ****************/
	/****************************************************/
	
	--创建用户(以管理员身份登录数据库,创建新用户)
	create user qichangjian identified by 274039;
	
	--为用户分配权限
	grant create session,resource,dba to qichangjian;
	
	--创建表空间
	create tablespace qichangjian_data
	datafile   'E:\Oracle\oracleWorkspace\qichangjian_data.dbf' size 10m
	autoextend on next 1m maxsize 500m
	extent management local;
	
	--给用户指定表空间
	alter user qichangjian  default tablespace qichangjian_data;
	
	--用新创建的用户登陆数据库(conn qichangjian/274039
2.登录用户创建表,插入数据
	/****************************************************/
	/***********    创建表,建立约束   ******************/
	/****************************************************/
	create table t_test(
	       test_parent varchar(20),
	       test_child varchar(20)
	)	
3.插入数据样式
test_parent test_child
grandpa father
father son
father daughter
son grandchild
Null grandpa
4.查询测试
a.直接查询结果
-- 正常查询:不会分层,没顺序
select * from t_test;

Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字

b.分层查询结果
-- 分层查询:会分层
select test_parent,test_child from t_test 
       start with test_parent is NUll
       connect by prior test_child = test_parent
        --start with test_parent is NUll;

Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字

c.分层查询方向问题

遍历树的方向
进一步说明CONNECT BY子句,它决定你是从顶向下还是从底向上进行遍历。CONNECT BY PRIOR col_1 = col_2。

如果是从顶向下遍历
test_parent(col_1) 是父键(它标识父),test_child(col_2) 是子键(它标识子)

select test_parent,test_child from t_test 
       start with test_parent ='son'
       connect by prior test_parent = test_child

Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字
如果是从底向上遍历
test_parent(col_1)就是子键,test_child(col_2) 就是父键了。

select test_parent,test_child from t_test 
       start with test_child = 'son'
       connect by prior test_child = test_parent;

Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字

d.递归(树)查询level关键字

level解释

level 和 connect by ,start with 合在一起,一般是用来实现递归(树)查询。
     connect by 子句定义表中的数据是如何相互联系的 
     start with 子句定义树查询的初始起点
     level 表示查询深度(level 表示递归的层次)
-- level 还可以用于图形化输出结果
--------lpad左填充用*
--------level表示查询深度(level表示递归的层次)
select lpad(test_child,length(test_child) + level*10-10,'*') from t_test 
       start with test_parent is NUll
       connect by prior test_child = test_parent;

Oracle分层查询(递归查询):start with...connect by prior 以及 level关键字