CONNECT_BY_ROOT 是一个在 Oracle 数据库中使用的特殊函数,它通常用于在层次查询中获取根节点的值。在使用 CONNECT BY 子句进行层次查询时,通过 CONNECT_BY_ROOT 函数,你可以在每一行中获取根节点的值,而不仅仅是当前行的值。
假设有一个需求,给定一个编码,需要查询出来它的子级、孙级 😄
那么我们可以使用oracle中的CONNECT_BY_ROOT函数,来对编码进行层次查询。
sql如下:
SELECT CONNECT_BY_ROOT a.PCODE AS Parent,
LEVEL,
a.PCODE,
a.RULESCODE
FROM GR_REVIEWRULES a
START WITH a.PCODE = '2.1.1.1'
CONNECT BY PRIOR a.RULESCODE = a.PCODE;
如下图所示:

让我进行解释下:
-
SELECT CONNECT_BY_ROOT a.PCODE AS Parent, LEVEL, a.PCODE, a.RULESCODE: 这部分定义了查询的输出列。CONNECT_BY_ROOT a.PCODE显示了子级和孙级的总级(根节点)编码,LEVEL表示当前节点在层次结构中的级别,a.PCODE显示了2.1.1.1所有的子级编码,a.RULESCODE为2.1.1.1所有孙级编码 -
START WITH a.PCODE = '2.1.1.1': 定义查询的起始节点,从具有编码值为'2.1.1.1'的行开始。 -
CONNECT BY PRIOR a.RULESCODE = a.PCODE: 使用CONNECT BY子句来定义如何递归地遍历层次结构。在这里,PRIOR a.RULESCODE表示父(子)节点的规则代码,a.PCODE表示子(孙)节点的编码。这告诉数据库如何构建层次结构。
当提供编码 '2.1.1.1' 时,这个查询将递归地返回给定编码的子级和孙级的信息。Parent 列将显示子级和孙级的总级(根节点)编码,以反映它们在整个层次结构中的位置。那么我们如果指定一些编码来查询他们的子级、孙级,可以将= '2.1.1.1' 改为 in ( .......) ,具体我们需要结合实际情况
以下是改成 in 以后的的sql:
SELECT CONNECT_BY_ROOT PCODE AS Parent, LEVEL, PCODE, RULESCODE
FROM GR_REVIEWRULES
START WITH PCODE in (SELECT grv.RULESCODE AS RulesCode
from GR_REVIEWRULES grv
where grv.canedit = '1')
CONNECT BY PRIOR RULESCODE = PCODE;
以上就是本次对CONNECT_BY_ROOT 的介绍啦~~~










