千家信息网

oracle中connect by怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了oracle中connect by怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、基本语法select *
千家信息网最后更新 2026年11月01日oracle中connect by怎么用

这篇文章主要介绍了oracle中connect by怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1、基本语法

select * from table [start with condition1] connect by [prior] id=parentid        

一般用来查找存在父子关系的数据,也就是树形结构的数据;其返还的数据也能够明确的区分出每一层的数据。

  • start with condition1 是用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。

  • connect by [prior] id=parentid 这部分是用来指明oracle在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。

prior还有一种用法:

select * from table [start with condition1] connect by id= [prior] parentid   
  • 这种用法就表示从下往上查找数据,可以理解为从叶子节点往上查找父级几点,用第一层数据的parentid去跟表记录里面的id进行匹配,匹配成功那么查找出来的就是第二层数据;上面的那种就是从父级节点往下查找叶子节点。

其他特性

  1. level关键字,代表树形结构中的层级编号;第一层是数字1,第二层数字2,依次递增。

  2. CONNECT_BY_ROOT方法,能够获取第一层集结点结果集中的任意字段的值;例CONNECT_BY_ROOT(字段名)。

2、下面来贴两个例子

2.1 从根节点查找叶子节点

select t.*, level, CONNECT_BY_ROOT(id) from tab_test t start with t.id = 0 connect by prior t.id = t.fid;

2.2 从叶子节点查找上层节点

--第一种,修改prior关键字位置 select t.*, level, CONNECT_BY_ROOT(id) from tab_test t start with t.id = 4 connect by t.id = prior t.fid; --第二种,prior关键字不动 调换后面的id=fid逻辑关系的顺序 select t.*, level, CONNECT_BY_ROOT(id) from tab_test t start with t.id = 4 connect by prior t.fid = t.id;

3、写几个平常用到的其他一些用法

3.1 生成数字序列结果集

  • 使用rownum实现1到10的序列。

select rownum from dual connect by rownum<=10;     
  • 使用level实现1到10的序列。

select level from dual connect by level<=10; 

3.3 字符串分割,由一行变为多行

  1. 比如说分割01#02#03#04这种有规律的字符串

select REGEXP_SUBSTR('01#02#03#04', '[^#]+', 1, rownum) as newport from dual connect by rownum <= REGEXP_COUNT('01#02#03#04', '[^#]+');             

5、下面再看看几个例子,针对多条结果集当省略prior关键字时怎样获得正确的返回结果

5.1 有下面一个结果集

想要实现1-5,20-30的数据递增返回1、2、3、4、5、20、21、22、23、24、25、26、27、28、29、30总共16条记录。

SQL如下:

with temp0 as ( select t.range_num,          REGEXP_SUBSTR(t.range_num, '[^-]+', 1, 1) minNum, --最小num          REGEXP_SUBSTR(t.range_num, '[^-]+', 1, 2) maxNum --最大num from range_table t) select t1.range_num ,t2.lv from temp0 t1 join ( select level lv from dual CONNECT BY LEVEL <= (select max(maxNum) from temp0 )          ) t2 on (t2.lv >=t1.minNum and t2.lv <=t1.maxNum);


上面的sql中是先求出range_num的最大值与最小值,然后利用connect by 特性生成数值序列结果集,最后让两个结果集关联得到需要的结果。

5.2 再看稍微复杂的结果集,输出结果格式跟上面一样

SQL如下:

with temp0 as ( select b.range_num,         REGEXP_SUBSTR(b.range_num, '[^,]+', 1, c.lv) as newport,         REGEXP_SUBSTR(REGEXP_SUBSTR(b.range_num, '[^,]+', 1, c.lv), '[^-]+', 1, 1) as minNum,         REGEXP_SUBSTR(REGEXP_SUBSTR(b.range_num, '[^,]+', 1, c.lv), '[^-]+', 1, 2) as maxNum from (select regexp_count(a.range_num, '[^,]+') AS cnt,                range_num from range_table a) b join (select LEVEL lv from dual CONNECT BY LEVEL <= 50) c   --这里的50表示的是range_num通过,分割后的数量,这里写死了50也可以sql动态max出来 on c.lv <= b.cnt) select t1.range_num,t2.lv from temp0 t1 join ( select level lv from dual CONNECT BY LEVEL <= ( select max(to_number(maxNum)) from temp0          )       ) t2 on ((t2.lv >=t1.minNum and t2.lv <=t1.maxNum));

感谢你能够认真阅读完这篇文章,希望小编分享的"oracle中connect by怎么用"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

数据 结果 节点 二层 关键 关键字 叶子 序列 篇文章 字段 数字 最大 最小 两个 例子 字符 字符串 就是 树形 比如说 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 互联网最新的科技有限公司 关于新基建和互联网科技 科技制造互联网公司 北京互联网科技 互联网 的科技创新 以房互联网科技 深圳期待互联网科技 互联网科技股有哪些 互联网科技有限公司 翻译 成都玖崟互联网科技有限公司乐商圈怎么样 剑昆互联网络科技有限公司临桂 华夏恒生科技与互联网科技 中和天地互联网科技有限公司 互联网科技股为什么大涨 工业互联网科技创业 新氧科技和美国互联网有关系吗 湖北辰鑫科技互联网 上海万顺科技互联网有限公司招聘 瑞安市蟠桃会互联网科技有限公司 南京欣网互联网络科技 伟宏互联网科技 互联网巨头投资的硬核科技 北京大学互联网科技怎么样 湖北码尼互联网科技有限公司电话 东莞新华互联网科技学校 互联网行业科技股 互联网科技创新的路径 马化腾互联网科技教学 数字科技和互联网金融哪个好
0