分享

Oracle中递归查询(START WITH……CONNECT BY……)

 jacklopy 2023-08-25 发布于河北

1、基本语法

在Oracle中START WITH……CONNECT BY……一般用来查找存在父子关系的数据,也就是树形结构的数据。

SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;
  • start with [condition]:设置起点,用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。省略后默认以全部行为起点。

  • connect by [condition] :用来指明在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据某个字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理往下递归匹配。

  • prior : 表示上一层级的标识符。经常用来对下一层级的数据进行限制。不可以接伪列。PRIOR在等号前面和后面,查询的数据是不一样的,如下用例:

  • level :伪列(关键字),代表树形结构中的层级编号(数字序列结果集),这个必须配合connect by 使用,和rownum是同等效果。

  • connect_by_root() :显示根节点列。经常用来分组。

  • connect_by_isleaf :1是叶子节点,0不是叶子节点。在制作树状表格时必用关键字。

  • sys_connect_by_path() :将递归过程中的列进行拼接。

  • nocycle , connect_by_iscycle : 在有循环结构的查询中使用。

  • siblings : 保留树状结构,对兄弟节点进行排序

2、基本案例解释

以下用的表结构来源于 测试用例数据 。

1)最基本查询

--从PARENT为空开始扫描  
 SELECT * FROM tab_connect_by A 
  START WITH A.PARENT IS NULL CONNECT BY PRIOR A.CHILD = A.PARENT;
SELECT * FROM tab_connect_by A 
  WHERE A.PARENT = '5'--条件3
  START WITH A.PARENT = '15' --条件1CONNECT BY PRIOR A.CHILD = A.PARENT;--条件2

查询结果如下:

根据结果可以看出,条件的优先级,根据start with后的条件查询第一条数据,然后根据connect by的条件,利用先决条件(start with)查询的child为起点作为下条数据的父节点递归查询所有的数据;

其中where是根据最后所有递归出的数据再进行过滤。

2)prior的用法

复制代码
--PRIOR在等号前面,向下递归,查找对应的子节点
 SELECT * FROM tab_connect_by A
  START WITH A.PARENT = '15' CONNECT BY PRIOR A.CHILD = A.PARENT;--PRIOR在等号后面,向上递归,查找对应的子节点
 SELECT * FROM tab_connect_by A
  START WITH A.PARENT = '15' CONNECT BY A.CHILD = PRIOR A.PARENT; SELECT * FROM tab_connect_by A
  START WITH A.PARENT = '15' CONNECT BY PRIOR A.PARENT = A.CHILD;
复制代码

查询结果如下:根据案例可以理解一下prior的用法。

3)其他

复制代码
SELECT A.PARENT 
      ,A.CHILD 
      ,LEVEL "层次"  
      ,SYS_CONNECT_BY_PATH(CHILD, '<-') "合并层次"  
      ,PRIOR A.CHILD "父节点"  
      ,CONNECT_BY_ROOT A.CHILD "根节点"  
      ,DECODE(CONNECT_BY_ISLEAF, 1, A.CHILD, NULL) "子节点"  
      ,DECODE(CONNECT_BY_ISLEAF, 1, '是', '否') "是否子节点"  
  FROM TAB_CONNECT_BY A  
 START WITH A.PARENT IS NULL --从PARENT为空开始扫描  CONNECT BY PRIOR A.CHILD = A.PARENT --以CHILD为父列连接PARENT  
 ORDER SIBLINGS BY CHILD DESC --对层次排序  ;
复制代码

查询结果如下:

4)数字序列结果集:LEVEL、ROWNUM

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 10;SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM <= 10;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多