深入理解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