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;
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;
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
如果是从底向上遍历:
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;
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;