Oracle递归查询(查询当前记录所有父级或子级)

本文介绍了如何使用Oracle的递归查询功能来获取组织结构中当前记录的所有上级(父级)和下级(子级)。通过START WITH和CONNECT BY子句,可以轻松地向上追溯到根节点或向下遍历到所有子节点,这对于理解和管理层次结构数据非常有用。

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

Oracle递归查询(查询当前记录所有父级或子级)

向上递归查询 所有上级

元数据:

1

2

3

4

SELECT *

FROM ORGANIZE

START WITH PARENT_ID = '1409'

CONNECT BY PRIOR PARENT_ID = TID

  

1

2

3

4

向上递归查询 所有上级SQL:<br>    SELECT *

    FROM ORGANIZE

    START WITH TID = '1409'

    CONNECT BY PRIOR PARENT_ID = TID

结果:

向下递归: 即查询当前的级别的所有子级

元数据:

1

2

3

    

SELECT * FROM ORGANIZE START WITH TID = '1408'

   CONNECT BY PRIOR TID = PARENT_ID

  

1

2

3

4

向下递归: 即查询当前的级别的所有子级

         

   SELECT * FROM ORGANIZE START WITH PARENT_ID = '1408'

    CONNECT BY PRIOR TID = PARENT_ID

  

可以通过递归查询实现,具体实现过程如下: 1. 定义一个存储过程,传入参数为id,该参数表示要查询的节点id。 2. 在存储过程中,先查询出与该节点id关联的id和id,这里可以使用联结查询和UNION ALL操作。 3. 然后分别对id和id进行递归查询,直到查询到的id和id不存在为止。 4. 在递归查询过程中,可以使用一个临时表来保存已经查询过的节点id,避免重复查询。 5. 最后返回查询到的id和id的总数,即为id一共关联的id和id的数量。 下面是一个示例代码,仅供参考: ``` 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 -- 查询与该节点关联的id和id 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一共关联的id和id的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值