深入理解Oracle 的 connect by level

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

 

posted @ 2023-12-11 16:47  编程小白1024  阅读(1800)  评论(1编辑  收藏  举报