Code前端首页关于Code前端联系我们

一个有趣的Oracle递归函数(connect by)

terry 2年前 (2023-09-26) 阅读数 85 #后端开发

在日常开发场景中,我们经常会用到递归查询。使用递归 Oracle 查询以 connt by 开头。此语法中 s 的开头表示搜索的开始。 node, connet byprior 表示关联条件。

话不多说,我们开始构建数据oracle有趣的递归函数(connect by)

通常我们需要找到所有ID=1的节点,使用如下SQL:

SELECT  * FROM TEST_IDPARENT START WITH ID=1 CONNECT BY PRIOR ID=PARENTID;

得到如下结果oracle有趣的递归函数(connect by)

如果我们需要排除某个子节点并且Children 节点怎么办,比如我们需要排除长沙分公司下的所有节点。目前,我们可以在 CONNECT BY 之后添加排除条件,如下所示:

SELECT  * FROM TEST_IDPARENT START WITH ID=1 CONNECT BY  ID<> 3  AND  PRIOR ID=PARENTID;
oracle有趣的递归函数(connect by)

另外,有时我们想知道哪个是我们的根节点,我们需要使用 CONNECT_BY_ROOT 来获取根节点。链接如下:

SELECT CONNECT_BY_ROOT(NAME), T.*
  FROM TEST_IDPARENT T
 START WITH ID = 1
CONNECT BY ID <> 3
       AND PRIOR ID = PARENTID;
oracle有趣的递归函数(connect by)

我们还常用 SYS_CONNECT_BY_PATH 和 LEVEL 字段来显示完整路径和层次结构级别。其中有2个参数为SYS_CONNECT_BY_PATH,显示字段和连接。

的符号如下:

SELECT CONNECT_BY_ROOT(NAME), SYS_CONNECT_BY_PATH(NAME,'/'), LEVEL, T.*
  FROM TEST_IDPARENT T
 START WITH ID = 1
CONNECT BY PRIOR ID = PARENTID;
oracle有趣的递归函数(connect by)

还有一个函数用来判断是否是叶子节点(即没有子节点) CONNECT_BY_ISLEAF

SELECT CONNECT_BY_ROOT(NAME), SYS_CONNECT_BY_PATH(NAME, '/'), LEVEL, T.*
  FROM TEST_IDPARENT T
 WHERE CONNECT_BY_ISLEAF = 1
 START WITH ID = 1
CONNECT BY PRIOR ID = PARENTID;
oracle有趣的递归函数(connect by)

输出中只有level= 4 ,因为LEVEL4子节点下no没有别的,所以CONNECT_BY_ISLEAF = 1过滤没有子节点(即叶子节点)的数据。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门