“CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询。
语法:
select...from <TableName>
where <Conditional-1>
start with <Conditional-2>
connect by <Conditional-3>
order siblings by <Conditional-4>;
说明:
1、<Conditional-2>:根节点条件,用于第一次过滤出根节点。
2、<Conditional-3>:连接条件,nocycle关键字,防止循环,当分层查询中存在上下层互为父子节点的情况时,需要在connect by后面加上nocycle;prior操作符,用于层级条件,没有prior操作符不会发生层级关联,一个connect by语句中可以有多个prior条件,也可以有其他普通条件,但是prior不能用于sequence序列。
3、<Conditional-4>:同级节点排序条件。
执行顺序:
1、句中有多表关联,先执行关联,无论是join还是where条件中的关联条件。
2、行start with的条件,选出第一个节点。
3、行connect by 的条件,层级关联,选出子节点。
4、行where中的过滤条件,排除结果集中不满足条件的记录,但是不会因为排除一条记录而把它对应的子节点排除。
5、行order siblings by的排序条件,对同级节点排序。
伪列:
1、
level:标记层级级数,最上层节点为1,之后为2、3……。
2、
connect_by_iscycle:定位出存在互为父子循环的具体节点,必须跟关键字nocycle结合起来使用。
3、
connect_by_isleaf:判断是否为叶子节点,即没有子节点,1为是,0为否。
4、
connect_by_root:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。
函数:
sys_connect_by_path(column,char):记录根节点到此节点的路径,column是每个节点的路径值,以char分割,column和char都必须是char,varchar2,nchar,或者nvarchar2。
通过connect by 生成序列:select rownum from dual connect by rownum<=10;