oracle分层(利用父级与子级ID横向展示层级)

本文介绍了一种使用SQL语句从组织机构表中获取特定层级机构代码的方法。通过使用Oracle特有的SYS_CONNECT_BY_PATH函数配合正则表达式函数REGEXP_SUBSTR,能够有效地提取出指定层级的组织机构代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一张组织机构表(存父级与子级组织机构关系),表结构如下图:

===============================================================================================

SQL语句如下:

select
   regexp_substr(SYS_CONNECT_BY_PATH (t.orgid, '/'),'[^/]+[A-Za-z0-9_]*',1,1)  orgcode1,
   regexp_substr(SYS_CONNECT_BY_PATH (t.orgid, '/'),'[^/]+[A-Za-z0-9_]*',1,2)  orgcode2,
   regexp_substr(SYS_CONNECT_BY_PATH (t.orgid, '/'),'[^/]+[A-Za-z0-9_]*',1,3)  orgcode3,
   t.orgid, t.orgcode, t.parentorgid
from tbl_orgm_org t
START WITH t.parentorgid='10010000'
 CONNECT BY NOCYCLE t.parentorgid = PRIOR t.orgid

===============================================================================================

执行结果如下图:


可以通过递归查询实现,具体实现过程如下: 1. 定义一个存储过程,传入参数为id,该参数表示要查询的节点id。 2. 在存储过程中,先查询出该节点id关联的idid,这里可以使用联结查询和UNION ALL操作。 3. 然后分别对idid进行递归查询,直到查询到的idid不存在为止。 4. 在递归查询过程中,可以使用一个临时表来保存已经查询过的节点id,避免重复查询。 5. 最后返回查询到的idid的总数,即为id一共关联的idid的数量。 下面是一个示例代码,仅供参考: ``` CREATE OR REPLACE PROCEDURE count_relations (p_id NUMBER, p_count OUT NUMBER) IS TYPE relation_type IS RECORD ( parent_id NUMBER, child_id NUMBER ); v_checked_ids SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(); v_relations relation_type; v_parent_count NUMBER := 0; v_child_count NUMBER := 0; BEGIN -- 查询该节点关联的idid SELECT parent_id, child_id INTO v_relations FROM your_table WHERE id = p_id; -- 递归查询id IF v_relations.parent_id IS NOT NULL AND NOT v_relations.parent_id MEMBER OF v_checked_ids THEN v_checked_ids.EXTEND; v_checked_ids(v_checked_ids.LAST) := v_relations.parent_id; count_relations(v_relations.parent_id, v_parent_count); END IF; -- 递归查询id IF v_relations.child_id IS NOT NULL AND NOT v_relations.child_id MEMBER OF v_checked_ids THEN v_checked_ids.EXTEND; v_checked_ids(v_checked_ids.LAST) := v_relations.child_id; count_relations(v_relations.child_id, v_child_count); END IF; -- 计算总数并返回 p_count := v_parent_count + v_child_count + 1; END; ``` 使用方法: ``` DECLARE v_count NUMBER; BEGIN count_relations(1, v_count); DBMS_OUTPUT.PUT_LINE('Total relations: ' || v_count); END; ``` 其中,1为要查询的节点id。执行后会输出id一共关联的idid的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值