基本语法
select … from tablename
where 条件1
start with 条件2
connect by 条件3(PRIOR);
条件1:相当于基本的筛选数据
条件2:递归查询起始条件
条件3:连接条件,其中用PRIOR
表示上一条记录的结果作为本次查询的条件,比如:
CONNECT BY PRIOR id= parent_id
;就是说上一条记录的id
是本条记录的parent_id
再进行查询(查子集);
CONNECT BY id= PRIOR parent_id
;就是说上一条记录的parent_id
是本条记录的id
再进行查询(查父集);
实验场景
原始表数据:
对应关系图:
1.实验一:(查询自己及自己所有子集)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH id = 1
CONNECT BY PRIOR ID=PARENTID
查询结果:
可以看出,查询出id为1的所有子集与他自己,查询过程:第一次查询为:
id=1
的;第二次查询为:PARENTID=第一次查询的id
;第三次查询为:PARENTID=第二次查询的id
其中
level
可以看出树的层级
2.实验二:(进一步验证实验一)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH id = 10
CONNECT BY PRIOR ID=PARENTID
查询结果:
查询出
id为10
的记录及其子集,并未查询其父集
3.实验三:(仅查询子集)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH parentid = 1
CONNECT BY PRIOR ID=PARENTID
查询结果:
查询出
id=1
的子集,因为START WITH(初始条件)
查询的是parentid = 1
的记录
4.实验四:(START WITH
后条件也可为多条件)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH (id=10 or id=2 or id=280)
CONNECT BY PRIOR ID=PARENTID
查询结果:
发现查询结果与实验三一致
5.实验五:(查询自己及父集)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH id = 270
CONNECT BY ID = PRIOR PARENTID
查询结果:
查询出自己及父集
6.实验六:(对查询结果 order by)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
START WITH id = 1
CONNECT BY PRIOR ID=PARENTID
order by level
查询结果:
证明,可以对查询后结果进行相关操作
7.实验七:(可以通过where条件筛选自己所需要的数据)
SELECT DISTINCT ID,level
FROM org
where DELETEFLAG =0 and ENABLEFLAG = 0
and level!=3
START WITH id = 1
CONNECT BY PRIOR ID=PARENTID
查询结果:
证明我们可以通过where 条件查询我们所需要的数据
结束