深入理解Oracle 的 connect by level

发布时间 2023-12-11 16:47:49作者: 编程小白1024

1、connect by

connect by 中的条件就表示了父子之间的连接关系
比如 connect by id = prior pid

默认是从根开始,如connect by prior id = pid,表示构造树时,本记录的id是下条的pid,即找pid=本条id的记录做下条记录。

交换prior位置,表示从叶开始。如connect by id = prior pid,表示构造树时,本记录的pid是下条的id。

 ps:prior表示构造树的源头方向。

2、level

level是在树形结构中、表示层级的伪列

Level案例解释:

create table aaa(id varchar2(1));

insert into aaa (id) values ('a');
insert into aaa (id) values ('b');
insert into aaa (id) values ('c');

1.1、当我们查询level < 2时

select id,level from aaa connect by level < 2;

-- 即:
  a b c

1.2、当我们查询level < 3时

select id,level from aaa connect by level < 3;

-- 即:
  a        b       c
a b c    a b c   a b c

 1.3、当我们查询level < 4时

select id,level from aaa connect by level < 4;

-- 即:
          a                         b                         c
  a       b       c         a       b       c         a       b       c
a b c   a b c   a b c     a b c   a b c   a b c     a b c   a b c   a b c

 

 

3、level使用场景

3.1、构造连续的数字

select level from dual connect by level<=5;

 3.2、构造连续的日期

select sysdate+level from dual connect by level<=5;

 3.3、字符串拆分

SELECT REGEXP_SUBSTR('a,b,22', '[^,]+', 1, LEVEL)
  FROM DUAL
CONNECT BY REGEXP_SUBSTR('a,b,22', '[^,]+', 1, LEVEL) IS NOT NULL