Oracle start with connect by prior 递归查询
基本语法:
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 条件查询我们所需要的数据
结束