oracle树中prior的用法

本文通过创建部门表并插入数据,演示了 Oracle SQL 中 CONNECT BY 和 PRIOR 的使用方法,包括如何构建部门间的层级关系及使用 sys_connect_path 函数生成路径。

数据说明一切:

create table dept(deptno number,deptname varchar2(20),mgrno number);
insert into dept values (1, '总公司', null);
insert into dept values (2, '浙江分公司', 1);
insert into dept values (3, '杭州分公司', 2);
commit;

 

select t.* from dept t;

 

      DEPTNO    DEPTNAME    MGRNO
1    1    总公司   
2    2    浙江分公司    1
3    3    杭州分公司    2

select *  from dept   connect by prior mgrno=deptno ; --以子结点为开始向根结点遍历

 

      DEPTNO    DEPTNAME    MGRNO
1    1    总公司   
2    2    浙江分公司    1
3    1    总公司   
4    3    杭州分公司    2
5    2    浙江分公司    1
6    1    总公司   

 select  *  from dept start with mgrno=1 connect by prior mgrno=deptno ---以子结点为开始且开始为1,的遍历

       DEPTNO    DEPTNAME    MGRNO
1    2    浙江分公司    1
2    1    总公司   

-------------------------------------------------------------------------------------------------------------

select   from dept  connect by prior deptno= mgrno

 

        DEPTNO    DEPTNAME    MGRNO
1    2    浙江分公司    1
2    3    杭州分公司    2
3    3    杭州分公司    2
4    1    总公司   
5    2    浙江分公司    1
6    3    杭州分公司    2

 

select *  from dept start with mgrno=1 connect by prior deptno= mgrno

       DEPTNO    DEPTNAME    MGRNO
1    2    浙江分公司    1
2    3    杭州分公司    2

 

 总结:
1)prior放在子节点端,则表示扫描树是以start with指定的节点作为根节点从上往下扫描。可能对应一个或多个分支。
start with可以省略,如果省略,表示对所有节点都当成根节点分别进行遍历
2)prior放在父节点端,则表示扫描树是以start with指定的节点作为最低层子节点,从下往上扫描。顺序是子节点往父节点扫描,直到根节点为止,这种情况只能得到一个分支。
start with可以省略,如果省略,表示对所有节点都当成最低层子节点分别往根节点方向遍历

 

最后会了上面大家应该知道下面 sys_connect_path()

 sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示:

 select/* max(substr(*/sys_connect_by_path(deptname,',')/*,2))*/  from dept connect by prior deptno= mgrno;

        SYS_CONNECT_BY_PATH(DEPTNAME,'
1    ,浙江分公司
2    ,浙江分公司,杭州分公司
3    ,杭州分公司
4    ,总公司
5    ,总公司,浙江分公司
6    ,总公司,浙江分公司,杭州分公司

 

### Oracle PRIOR 关键字的含义和用法 #### 1. PRIOR 的基本概念 在 Oracle 数据库中,`PRIOR` 是一个用于定义层次结构查询的关键字。它通常与 `CONNECT BY` 子句结合使用,以指定父子关系的方向[^1]。具体来说,`PRIOR` 确定了当前行与其父行之间的关联方式,从而影响分层查询的结果。 #### 2. PRIOR 的作用 `PRIOR` 的主要作用是明确层次结构中数据的流向。通过将 `PRIOR` 放置在等式的左侧或右侧,可以定义从父到子或从子到父的关系[^2]。例如: - 当 `PRIOR` 出现在子节点字段的一侧时,表示从子节点追溯到父节点。 - 当 `PRIOR` 出现在父节点字段的一侧时,表示从父节点向下查找子节点。 #### 3. 使用示例 以下是一个典型的分层查询示例,展示如何使用 `PRIOR` 定义父子关系: ```sql SELECT LEVEL, empno, ename, mgr FROM scott.emp START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr; ``` - `START WITH`:指定查询的起点,即根节点。在此示例中,`mgr IS NULL` 表示没有上级的员工(通常是 CEO 或顶级管理者)[^1]。 - `CONNECT BY`:定义层次结构中的父子关系。`PRIOR empno = mgr` 表示当前行的 `empno` 是其父行的 `mgr`[^2]。 #### 4. PRIOR 的方向性 `PRIOR` 可以出现在等式的左侧或右侧,具体取决于需要定义的关系方向: - **从父到子**: ```sql CONNECT BY PRIOR child_column = parent_column; ``` 这表示 `child_column` 是子节点,`parent_column` 是父节点。 - **从子到父**: ```sql CONNECT BY PRIOR parent_column = child_column; ``` 这表示 `parent_column` 是父节点,`child_column` 是子节点。 #### 5. 处理循环引用 当数据中存在循环引用时,`CONNECT BY` 查询可能会导致错误。为了解决这一问题,可以使用 `NOCYCLE` 参数。`NOCYCLE` 允许查询即使在检测到循环时也能继续执行,并通过伪列 `CONNECT_BY_ISCYCLE` 标识出循环节点[^3]。 以下是一个包含循环的示例查询: ```sql SELECT LEVEL, id, parent_id, name, CONNECT_BY_ISCYCLE AS is_cycle FROM hierarchy START WITH parent_id IS NULL CONNECT BY NOCYCLE PRIOR id = parent_id; ``` - `NOCYCLE`:允许查询即使在检测到循环时也能继续执行。 - `CONNECT_BY_ISCYCLE`:返回值为 `1` 表示该行包含循环,返回值为 `0` 表示正常节点。 #### 6. 实际应用场景 `PRIOR` 常用于查询具有层级结构的数据,例如组织架构、分类目录或文件系统。以下是一个多级菜单的层级结构查询示例: ```sql SELECT ID, NVL(TO_CHAR(PARENT_ID), 'NULL') PARENT_ID, MODULE_NAME, BS_URL, ICON, ORDER_NO, IS_VISIBLE, SYS_CONNECT_BY_PATH(MODULE_NAME, '/') PATH FROM SM_MODULE START WITH PARENT_ID IS NULL CONNECT BY PRIOR ID = PARENT_ID; ``` 此查询展示了如何通过 `PRIOR` 和 `CONNECT BY` 构建状结构的菜单列表[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值