一个有趣的Oracle递归函数(connect by)
在日常开发场景中,我们经常会用到递归查询。使用递归 Oracle 查询以 connt by 开头。此语法中 s 的开头表示搜索的开始。 node, connet byprior 表示关联条件。
话不多说,我们开始构建数据
通常我们需要找到所有ID=1的节点,使用如下SQL:
SELECT * FROM TEST_IDPARENT START WITH ID=1 CONNECT BY PRIOR ID=PARENTID;
得到如下结果
如果我们需要排除某个子节点并且Children 节点怎么办,比如我们需要排除长沙分公司下的所有节点。目前,我们可以在 CONNECT BY 之后添加排除条件,如下所示:
SELECT * FROM TEST_IDPARENT START WITH ID=1 CONNECT BY ID<> 3 AND PRIOR ID=PARENTID;

另外,有时我们想知道哪个是我们的根节点,我们需要使用 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;

我们还常用 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;

还有一个函数用来判断是否是叶子节点(即没有子节点) 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;

输出中只有level= 4 ,因为LEVEL4子节点下no没有别的,所以CONNECT_BY_ISLEAF = 1过滤没有子节点(即叶子节点)的数据。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。