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.RULESCODEFROM GR_REVIEWRULES aSTART 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, RULESCODEFROM GR_REVIEWRULESSTART WITH PCODE in (SELECT grv.RULESCODE AS RulesCodefrom GR_REVIEWRULES grvwhere grv.canedit = '1')
CONNECT BY PRIOR RULESCODE = PCODE;
以上就是本次对CONNECT_BY_ROOT 的介绍啦~~~