表结构简单T(id,parentId),如图
比如说输入A节点ID(001),能查询到DEG三个节点,输入B节点ID(001001)能查询到DE,CF的话能查询到G,脚本如何写?只查询叶子节点,不查询类似BCF这样有下层节点的节点。
oracle如何查询任意节点下的所有子节点
答案:2 悬赏:80
解决时间 2021-04-23 01:18
- 提问者网友:我是我
- 2021-04-22 10:31
最佳答案
- 二级知识专家网友:心痛成瘾
- 2021-04-22 10:43
向下递归+叶子节点过滤就行了,例子:
--模拟数据
with tmp(id,pid) as
(SELECt 'A','' FROM DUAL UNIOn ALL
SELECt 'B','A' FROM DUAL UNIOn ALL
SELECt 'C','A' FROM DUAL UNIOn ALL
SELECt 'D','B' FROM DUAL UNIOn ALL
SELECt 'E','B' FROM DUAL UNIOn ALL
SELECt 'F','C' FROM DUAL UNIOn ALL
SELECt 'G','F' FROM DUAL )
SELECt ID FROM TMP T
WHERe CONNECT_BY_ISLEAF=1 --只显示叶子节点
START WITH T.ID='A' --递归起点,即查询条件
CONNECT BY PRIOR ID=PID --递归条件,向下递归
--模拟数据
with tmp(id,pid) as
(SELECt 'A','' FROM DUAL UNIOn ALL
SELECt 'B','A' FROM DUAL UNIOn ALL
SELECt 'C','A' FROM DUAL UNIOn ALL
SELECt 'D','B' FROM DUAL UNIOn ALL
SELECt 'E','B' FROM DUAL UNIOn ALL
SELECt 'F','C' FROM DUAL UNIOn ALL
SELECt 'G','F' FROM DUAL )
SELECt ID FROM TMP T
WHERe CONNECT_BY_ISLEAF=1 --只显示叶子节点
START WITH T.ID='A' --递归起点,即查询条件
CONNECT BY PRIOR ID=PID --递归条件,向下递归
全部回答
- 1楼网友:末路丶一枝花
- 2021-04-22 12:07
我感觉你应该分两步走,第一找到父节点,第二,将这些父节点加上条件。不知道你的父节点和叶子节点是怎么存储到表中的,我举一个父节点和叶子节点存储在一个表中的情况给你说一下。
第一步,找到所有父节点 select 父节点 from table_a where table_a.isdetail<>1(意思是说,父节点不是明细项)
第二步,找到叶子节点的父节点:select 父节点 from table_a where table_a.isdetail<>1 and table_a.叶子节点 in(叶子节点)
第三步,再加上条件:找到叶子节点的父节点:select 父节点 from table_a where table_a.isdetail<>1 and table_a.叶子节点 in(叶子节点)and 父节点不符合哪些条件。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯