oracle connect by详解

1、作用:

用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询。

2、语法

SELECT ... 
FROM ....
START WITH cond1 
CONNECT BY cond2
WHERE cond3;

2.1、说明

start with: 指定起始节点的条件

connect by: 指定父子行的条件关系

prior: 查询父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and … ,

nocycle: 若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条

循环行: 该行只有一个子行,而且子行又是该行的祖先行

connect_by_iscycle: 前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1 表示是

connect_by_isleaf: 是否是叶子节点,0表示否,1 表示是

level: level伪列,表示层级,值越小层级越高,level=1为层级最高节点

3、构造数据

-- 创建表
create table employee(emp_id number(18),lead_id number(18),emp_name varchar2(200),salary number(10,2),dept_no varchar2(8)
);-- 添加数据
insert into employee values('1',0,'king','1000000.00','001');
insert into employee values('2',1,'jack','50500.00','002');
insert into employee values('3',1,'arise','60000.00','003');
insert into employee values('4',2,'scott','30000.00','002');
insert into employee values('5',2,'tiger','25000.00','002');
insert into employee values('6',3,'wudde','23000.00','003');
insert into employee values('7',3,'joker','21000.00','003');

在这里插入图片描述

4、查询jack下的所有子节点

select * from employee start with emp_name='jack' connect by prior emp_id=lead_id;emp_id | lead_id | emp_name | salary | dept_no 
--------+---------+----------+--------+---------2 |       1 | jack     |  50500 | 0024 |       2 | scott    |  30000 | 0025 |       2 | tiger    |  25000 | 002
(3 rows)

5、查询jack和arise下的所有子节点

select * from employee start with emp_name in ('jack', 'arise') connect by prior emp_id=lead_id;emp_id | lead_id | emp_name | salary | dept_no 
--------+---------+----------+--------+---------2 |       1 | jack     |  50500 | 0024 |       2 | scott    |  30000 | 0025 |       2 | tiger    |  25000 | 0023 |       1 | arise    |  60000 | 0036 |       3 | wudde    |  23000 | 0037 |       3 | joker    |  21000 | 003
(6 rows)

6、查询jack的祖先节点

select * from employee start with emp_name='jack' connect by prior lead_id=emp_id;emp_id | lead_id | emp_name | salary  | dept_no 
--------+---------+----------+---------+---------2 |       1 | jack     |   50500 | 0021 |       0 | king     | 1000000 | 001
(2 rows)

7、查询一个节点的叔叔伯父节点

--查看emp_id为6的节点的叔叔伯父节点
with temp as (select  employee.*,prior emp_name,level lefrom employee start with lead_id = 0connect by lead_id=prior emp_id
)
select *
from temp t
left join temp tt on tt.emp_id=6 --此处需要限定
where t.le = (tt.le-1)and t.emp_id not in (tt.lead_id);emp_id | lead_id | emp_name | salary | dept_no | ?column? | le | emp_id | lead_id | emp_name | salary | dept_no | ?column? | le 
--------+---------+----------+--------+---------+----------+----+--------+---------+----------+--------+---------+----------+----2 |       1 | jack     |  50500 | 002     | king     |  2 |      6 |       3 | wudde    |  23000 | 003     | arise    |  3
(1 row)

8、查询族兄

--查看employee id是6的节点的族兄节点
with temp as (select employee.*,prior emp_name,level lefrom employee start with lead_id=0connect by lead_id= prior emp_id
)select t.*
from temp  t
left outer join temp tton tt.emp_id=6 --此处需要条件限制
where t.le=tt.le and t.emp_id<>6; --此处需要条件限制 emp_id | lead_id | emp_name | salary | dept_no | ?column? | le 
--------+---------+----------+--------+---------+----------+----4 |       2 | scott    |  30000 | 002     | jack     |  35 |       2 | tiger    |  25000 | 002     | jack     |  37 |       3 | joker    |  21000 | 003     | arise    |  3
(3 rows)

9、level伪列的使用,格式化层级

select lpad(' ',level*2,' ')||emp_name as name,emp_id,lead_id,salary,level
from employee
start with lead_id=0
connect by prior emp_id=lead_id; -- level数值越低级别越高name     | emp_id | lead_id | salary  | level 
-------------+--------+---------+---------+-------king      |      1 |       0 | 1000000 |     1jack    |      2 |       1 |   50500 |     2scott |      4 |       2 |   30000 |     3tiger |      5 |       2 |   25000 |     3arise   |      3 |       1 |   60000 |     2wudde |      6 |       3 |   23000 |     3joker |      7 |       3 |   21000 |     3
(7 rows)

10、connect_by_root 查找根节点

select connect_by_root emp_name,emp_name,lead_id,salary
from employee
start with lead_id=1
connect by prior emp_id = lead_id;connect_by_root | emp_name | lead_id | salary 
-----------------+----------+---------+--------jack            | jack     |       1 |  50500jack            | scott    |       2 |  30000jack            | tiger    |       2 |  25000arise           | arise    |       1 |  60000arise           | wudde    |       3 |  23000arise           | joker    |       3 |  21000
(6 rows)
-- 注意: connect_by_root关键字后面跟着字段,表示根节点对应记录的某一字段的值,-- 如 connect_by_root  emp_name表示根节点的员工名,connect_by_root salary表示根节点的工资

11、connect_by_isleaf 是否是叶子节点

select emp_id,emp_name,lead_id,salary,connect_by_isleaf
from employee
start with lead_id=0
connect by nocycle prior emp_id=lead_id;emp_id | emp_name | lead_id | salary  | connect_by_isleaf 
--------+----------+---------+---------+-------------------1 | king     |       0 | 1000000 |                 02 | jack     |       1 |   50500 |                 04 | scott    |       2 |   30000 |                 15 | tiger    |       2 |   25000 |                 13 | arise    |       1 |   60000 |                 06 | wudde    |       3 |   23000 |                 17 | joker    |       3 |   21000 |                 1
(7 rows)
-- 叶节点指的是没有子节点的节点,那些是既是父节点又是子节点的节点不属于叶节点

12、使用connect by rownum生成序列

ROWNUM是一个伪列,即先查到结果集之后再加上去的一个列,它的取值从1开始排依次递增。ROWNUM其实是oracle数据库从数据文件或缓冲区中读取数据的顺序。取得第一条记录则rownum值为1,第二条为2,依次类推。
connect by rownum是通过递归迭代第一行生成一个序列。格式如下:

select ***
from dual
connect by rownum<=n;

举例:

12.1 生成1-5之间的一个序列

select rownum 
from dual 
connect by rownum<=5;rownum 
--------12345
(5 rows)

12.2 生成10个60到100之间的随机整数

select rownum No,ROUND(DBMS_RANDOM.VALUE(60,100),0) Value
from dual
connect by rownum<=10;no | value 
----+-------1 |    772 |    643 |    674 |    865 |    826 |    777 |    948 |    899 |    6110 |    93
(10 rows)

12.3 生成连续的日期值

select rownum No,sysdate+rownum MyDate
from dual
connect by rownum<=10;no |       mydate        
----+---------------------1 | 2023-10-12 15:45:392 | 2023-10-13 15:45:393 | 2023-10-14 15:45:394 | 2023-10-15 15:45:395 | 2023-10-16 15:45:396 | 2023-10-17 15:45:397 | 2023-10-18 15:45:398 | 2023-10-19 15:45:399 | 2023-10-20 15:45:3910 | 2023-10-21 15:45:39
(10 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Spring Boot 中实现容错机制

在 Spring Boot 中实现容错机制 容错机制是构建健壮和可靠的应用程序的重要组成部分。它可以帮助应用程序在面对异常或故障时保持稳定运行。Spring Boot提供了多种机制来实现容错&#xff0c;包括异常处理、断路器、重试和降级等。本文将介绍如何在Spring Boot中实现这些容错机…

c#设计模式-行为型模式 之 迭代器模式

&#x1f680;简介 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&#xff09;角色&#xff1a;定义存储、添加、删除聚合元素以及创建迭代器对象的接口…

Spring Boot项目在Windows上的自启动策略与Windows自动登录配置

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

如何压缩视频?视频压缩变小方法汇总

视频是我们日常生活中不可或缺的一部分&#xff0c;但视频文件往往会占用大量存储空间&#xff0c;这在传输和分享过程中可能成为一个瓶颈。 为了解决这一问题&#xff0c;我们可以通过压缩的方式减小视频大小&#xff0c;视频压缩是指在保证视频质量的前提下&#xff0c;通过…

漏洞复现--鸿运主动安全监控云平台任意文件下载

免责声明&#xff1a; **文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…

Centos8 openjdk升级

1、卸载旧版本 sudo dnf remove java-1.8.0-openjdk 2、搜索新版本 yum search java-11-openjdk3、安装新版本 dnf install java-11-openjdk.x86_644、验证新版本 java -version

XSS原理

原理&#xff1a; 这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能&#xff0c;在HTML页面里嵌入恶意代码。当用户浏览改页时&#xff0c;这些潜入在HTML中的恶意代码会被执行&#xff0c;用户浏览器被攻…

Ubuntu 22.04‘Temporary failure resolving‘ 解决方案

终极解决方案 首先安装resolvconf sudo apt-get install resolvconf 使用 cd /etc/resolvconf/resolv.conf.d/ 进入文件夹&#xff0c;使用 ls 查看目录&#xff0c;会显示 base head tail 使用 sudo vim base 编辑base文件&#xff0c; 进入时为空&#xff0c;点击 i 添加 …

不了解无线调制方式?这几个“老古董”大家现在还在用!

当我们使用手机、电视、互联网或其他无线通信设备进行通信时&#xff0c;数字调制技术起到了关键作用。这些技术是将我们的声音、文字、图像和数据转换成适合在无线信道上传输的模拟信号的重要工具。 从最早的调幅调制&#xff08;ASK&#xff09;到现代的正交频分复用&#xf…

语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么

目录 一、语音芯片的简介 常见的语音芯片有哪些&#xff1f; 语音芯片的种类有很多&#xff0c;大体区分下来也就4个类别而已&#xff1a; 选型的经验说明如下&#xff1a; 推荐使用flash型语音芯片 一、语音芯片的简介 语音芯片基础知识&#xff1a; 什么是语音芯片&…

再一次整理一下spring框架步骤

1.pom.xml依赖 2.applicationbean.xml 3.类 小树叶可以跟bean联动起来 不写接口直接写类 实现类 4.测试 两种方法的实现

SQL:left join、right join 究竟什么区别?

1、SQL join 分三种 1&#xff09;inner join&#xff08;内连接&#xff0c;也叫等值连接&#xff09; 显示两个表中有联系的所有数据&#xff0c;是默认方式。 2&#xff09;cross join&#xff08;交叉连接&#xff09; 两个表格做笛卡尔积&#xff0c;显示的数据行数是…

Android studio安装详细教程

Android studio安装详细教程 文章目录 Android studio安装详细教程一、下载Android studio二、安装Android Studio三、启动Android Studio 一、下载Android studio Android studio安装的前提是必须保证安装了jdk1.8版本以上 1、打开android studio的官网&#xff1a;Download…

利用正则表达式进行数据采集和处理

目录 一、正则表达式的概述 二、正则表达式在数据采集中的运用 1、匹配和提取数据 2、数据清洗 3、数据验证 三、Python中的re模块介绍 1、re.match()方法 2、re.search()方法 总结 正则表达式是一种强大的文本处理工具&#xff0c;它可以用于模式匹配、提取、替换等操…

自动驾驶软件和人工智能

自动驾驶汽车的核心在于其软件系统&#xff0c;而其中的机器学习和深度学习技术是使车辆能够感知、理解、决策和行动的关键。本文将深入探讨这些技术在自动驾驶中的应用&#xff0c;包括感知、定位、路径规划以及道路标志和交通信号的识别。 1. 机器学习和深度学习在自动驾驶中…

利达卓越:推动互联网金融创新发展

随着信息技术的迅猛发展,互联网金融洗尽铅华,浴火蜕变,逐渐崭露头角成为金融领域的一股重要力量。对此,利达卓越积极推动互联网金融创新发展! 互联网金融是指传统金融机构与互联网企业利用互联网技术和信息通信技术实现资金融通、支付、投资和信息中介服务的新型金融业务模式。…

13SpringMVC中拦截器的配置(拦截规则)和多个拦截器的preHandle,postHandle执行顺序原理详解

拦截器 Servlet中的过滤器的实现及其原理,参考文章 配置一个拦截器 SpringMVC中请求的处理流程: 用户请求—>listener—>filter—>DispatcherServlet—>filter—>preHandle—>controller—>postHandle 第一步: 编写一个Java类实现HandlerInterceptor(…

(十五)VBA常用基础知识:正则表达式的使用

vba正则表达式的说明 项目说明Pattern在这里写正则表达式&#xff0c;例&#xff1a;[\d]{2,4}IgnoreCase大小写区分&#xff0c;默认false&#xff1a;区分&#xff1b;true&#xff1a;不区分Globaltrue&#xff1a;全体检索&#xff1b;false&#xff1a;最小匹配Test类似p…

[GXYCTF2019]Ping Ping Ping - RCE(空格、关键字绕过[3种方式])

[GXYCTF2019]Ping Ping Ping 1 解题流程1.1 小试牛刀1.2 三种解法1.2.1 解法一:变量定义拼接绕过1.2.2 解法二:base64编码绕过1.2.3 解法三:内联执行绕过2 思考总结1 解题流程 1.1 小试牛刀 1、提示?ip,结合题目名称,我们直接输入?ip=127.0.0.1 PING 127.0.0.1 (127.…

go 项目打包部署到服务器

1、window打包到Linux 步骤1 依次执行一下命令&#xff0c;就会得到一个exe 文件 步骤2 把打包的文件&#xff0c;放到服务器上&#xff08;可以使用FinalShell工具&#xff09; chmod x main # 执行这个命令&#xff0c;给main 文件添加 执行权限&#xff0c;然后执行 ls &…