Oracle start with connect by prior 递归查询

Oracle start with connect by prior 递归查询


基本语法:

selectfrom 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 条件查询我们所需要的数据


结束

posted @ 2020-03-05 11:10  丿似锦  阅读(523)  评论(0编辑  收藏  举报