Oracle函数6—递归查询(start with...connect by、sys_connect_by_path、level)

一、准备数据

  • 创建表
CREATE TABLE TEST_ORG
(
    ID VARCHAR2(64) NOT NULL PRIMARY KEY,
    NAME VARCHAR2(200),
    PARTEN_ID VARCHAR2(64)
);
comment on column TEST_ORG.ID is '主键';
comment on column TEST_ORG.NAME is '名称';
comment on column TEST_ORG.PARTEN_ID is '父级id';
  • 插入数据
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('1', '北京市', '0');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('4', '东城区', '1');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('6', '天安门', '4');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('5', '延庆区', '1');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('7', '八达岭', '5');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('2', '天津市', '0');
INSERT INTO EXECUTE_DB.TEST_ORG (ID, NAME, PARTEN_ID) VALUES('3', '上海市', '0');

二、基本使用

1、获取完整的树结构

 select * from TEST_ORG start with PARTEN_ID = 0 connect by prior id = PARTEN_ID;

执行结果:

id   name   parten_id
 1	 北京市	  0
 4	 东城区	  1
 6	 天安门	  4
 5	 延庆区	  1
 7	 八达岭 	  5
 2	 天津市	  0
 3	 上海市	  0

2、获取指定节点的全部子节点(包含指定节点)

例:获取北京市的全部子级,传入id=1

 select * from TEST_ORG start with id = 1 connect by prior id = PARTEN_ID;

执行结果:

id   name   parten_id
1	北京市	0
4	东城区	1
6	天安门	4
5	延庆区	1
7	八达岭	5

提示:会返回当前数据及全部子级节点。

3、获取指定节点的全部子节点(不包含指定节点)

例:获取北京市的全部子级,传入PARTEN_ID=1

 select * from TEST_ORG start with PARTEN_ID = 1 connect by prior id = PARTEN_ID;

执行结果:

id   name   parten_id
4	东城区	1
6	天安门	4
5	延庆区	1
7	八达岭	5

提示:只会返回当前数据的全部子级节点。

4、获取指定节点的全部父节点(包含指定节点)

例:获取天安门的全部父级

  select * from TEST_ORG start with id = 6 connect by prior PARTEN_ID = id;

执行结果:

id   name   parten_id
6	天安门	4
4	东城区	1
1	北京市	0

提示:会返回当前数据以及全部父级节点。

三、level函数

level字段为oracle特有的层级字段,可以通过level字段查询指定的层级。

例:获取天安门的全部父级上层级2的一层

  select t.*,level from TEST_ORG t WHERE level = 2 start with id = 6 connect by prior PARTEN_ID = id;

执行结果:

id   name   parten_id
4	东城区	1	2

提示:只会返回当前数据以及全部父级节点的层级为2的数据。

四、获取完整的全树路径

例:获取北京市以及全部子级,指定id=1表示北京市。

 select t.*,sys_connect_by_path(name, '->') text from TEST_ORG t start with id = 1 connect by prior id = PARTEN_ID;

执行结果:

id   name   parten_id  text
1	北京市	  0	      ->北京市
4	东城区	  1	      ->北京市->东城区
6	天安门	  4	      ->北京市->东城区->天安门
5	延庆区	  1	      ->北京市->延庆区
7	八达岭	  5	      ->北京市->延庆区->八达岭

提示:结合substr函数去除指定内容。

例如:去除最开始的->符号

select t.*,substr(sys_connect_by_path(name, '->'), 3) text from TEST_ORG t start with id = 1 connect by prior id = PARTEN_ID;

执行结果:

id   name   parten_id  text
1	北京市	   0	   北京市
4	东城区	   1	   北京市->东城区
6	天安门	   4	   北京市->东城区->天安门
5	延庆区	   1	   北京市->延庆区
7	八达岭	   5	   北京市->延庆区->八达岭

相关推荐

  1. oracle查询语法

    2024-03-23 03:56:02       10 阅读
  2. oracle 查询(结构树)

    2024-03-23 03:56:02       12 阅读
  3. mysql 查询

    2024-03-23 03:56:02       43 阅读
  4. Python:函数

    2024-03-23 03:56:02       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 03:56:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 03:56:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 03:56:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 03:56:02       20 阅读

热门阅读

  1. LeetCode2671. Frequency Tracker

    2024-03-23 03:56:02       17 阅读
  2. mysql char 与 varchar 的区别

    2024-03-23 03:56:02       17 阅读
  3. Mac安装Homebrew

    2024-03-23 03:56:02       23 阅读
  4. 1063:最大跨度值

    2024-03-23 03:56:02       21 阅读
  5. 洛谷入门——P1567 统计天数

    2024-03-23 03:56:02       21 阅读
  6. 合并两个 Git 仓库,保存所有提交记录

    2024-03-23 03:56:02       21 阅读
  7. CentOS7 安装和使用Docker

    2024-03-23 03:56:02       24 阅读
  8. HTML是什么,它在前端开发中扮演什么角色?

    2024-03-23 03:56:02       24 阅读